Re: [問題] 急問 關於記憶體 malloc

看板C_and_CPP作者 (搞笑藝鵝)時間16年前 (2009/10/28 09:37), 編輯推噓3(3020)
留言23則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《Leavesb (搞笑藝鵝)》之銘言: : 開發平台: Linux C : 有問題的code: code 在學校電腦,可能要明天才有辦法附 : 不過它有點長,可能也不能全貼 : 補充說明:有點急,希望版友們可以幫幫忙 : 謝謝 因為 code 有點長 所以另回一篇貼 解答後會自刪 請版主通融一下 :) 主要功能是對一個讀進來的字串作兩次 token 切割 第一次先對原字串作分段 (淺藍色) 然後再對每一段切第二次 (深藍色)黃色 malloc 處 兩次綠色 所印出來的值會有改變 以下節錄比較有可能出問題的幾段 main(argc, argv, envp) { char * temp [100]; char * temp2 [100]; int forward [2][100]; for ( ; ; ) { clilen = sizeof (cli_addr); newsockfd = accept(sockfd, (struct sockaddr*) &cli_addr, &clilen); if (newsockfd < 0) printf("server: accept error"); if ( (childpid = fork()) < 0) printf ("server: fork error"); else if (childpid == 0) { i = 0; j = 0; temp [i] = malloc (100); strcpy (temp [i] , strtok_r (fixbuf, delim, &delimbuffer)); i = i + 1; while ((p1 = strtok_r (NULL, delim, &delimbuffer))) { temp [i] = malloc (100); strcpy (temp [i] , p1); count = strlen (temp [i]); i = i + 1; } for (j; j < i; j++) { printf ("%d\n", forward [2][0]); temp2 [size] = malloc (100); printf ("%d\n", forward [2][0]); strcpy (temp2 [size] , strtok_r (temp [add], relim, &relimbuffer)); size = size + 1; signal = 0; while ((p2 = strtok_r (NULL, relim, &relimbuffer))) { temp2 [size] = malloc (100); strcpy (temp2 [size] , p2); count2 = strlen (temp2 [size]); size = size + 1; } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.241.114

10/28 09:47, , 1F
還有 code 跑完都會出現 Backtrace 和 Memory map qq
10/28 09:47, 1F
淡藍色的我眼滑了 沒貼到 已補上 :(

10/28 09:50, , 2F
淡藍色那, temp[i]為什麼還沒malloc就已經當strcpy的dst
10/28 09:50, 2F

10/28 09:51, , 3F
了?? 還有forward[2][100]第一維只有0~1能用, 你printf
10/28 09:51, 3F

10/28 09:52, , 4F
有地方印超過了. 最後, 第一篇文已經有初步懷疑是哪邊陣
10/28 09:52, 4F

10/28 09:52, , 5F
列用超過了, 應該是可以搭配breakpoint或print debug
10/28 09:52, 5F

10/28 09:53, , 6F
message稍微在code多做些檢查看看的:)
10/28 09:53, 6F
※ 編輯: Leavesb 來自: 140.113.241.114 (10/28 10:01)

10/28 10:03, , 7F
我的 code 後半部需要用到 forward 內的資料
10/28 10:03, 7F

10/28 10:04, , 8F
但用 GDB 檢查時發現在 malloc 值會變 不能有我想要的效果
10/28 10:04, 8F

10/28 10:05, , 9F
你的forward就是第一篇的test嗎?? 我只是發現你printf
10/28 10:05, 9F

10/28 10:05, , 10F
可能用forward用超過, 所以不曉得後面是不是有超過的@@"
10/28 10:05, 10F

10/28 10:06, , 11F
對 是相同的 只是昨天資料不在手邊 忘記名稱
10/28 10:06, 11F

10/28 10:07, , 12F
剛剛稍微修了一下 可以都變相同值了
10/28 10:07, 12F

10/28 10:08, , 13F
但是 server 端還是會跑出 Backtrace 和 Memory map qqqq
10/28 10:08, 13F

10/28 10:10, , 14F
Hmm~我發現code裡有一些沒先看到給值的變數當index, 如
10/28 10:10, 14F

10/28 10:10, , 15F
add, size; 如果是console程式建議您把每個寫入陣列的程
10/28 10:10, 15F

10/28 10:11, , 16F
式碼前都print一個debug msg包含index值; 再不然就code
10/28 10:11, 16F

10/28 10:11, , 17F
內寫個邊界判斷, 有超過的看能不能assert起來看看??
10/28 10:11, 17F

10/28 10:12, , 18F
小弟沒在Linux下coding過, 不曉得這樣debug行不行^^||
10/28 10:12, 18F

10/28 10:12, , 19F
有些變數因為篇幅關係 怕版友們不好閱讀 所以省略了
10/28 10:12, 19F

10/28 10:12, , 20F
PS. 就算i這個明顯看到給值的也不確定會否超過陣列大小.
10/28 10:12, 20F

10/28 10:13, , 21F
非常謝謝你的幫忙 我再去試看看 有問題在上版請教 :)
10/28 10:13, 21F

10/28 10:13, , 22F
好 我去檢查看看!
10/28 10:13, 22F

10/28 11:29, , 23F
言之有物就不用刪阿,我沒這麼閒喜歡到處砍文 XDD
10/28 11:29, 23F
文章代碼(AID): #1Avw18Bj (C_and_CPP)
文章代碼(AID): #1Avw18Bj (C_and_CPP)