[問題] malloc segmentation fault

看板C_and_CPP作者 (wnuiayldh)時間15年前 (2010/08/28 15:11), 編輯推噓4(4025)
留言29則, 10人參與, 最新討論串1/2 (看更多)
找到問題了...但還是不知道為什麼 function A(..., int* x, ...){ AAA* node = (AAA*) malloc( sizeof(AAA) ); ... } function B(...){ int* x; *x = 0; function A(... , x, ...); ... } 問題是出在x (錯的有點離譜XD int x; x = 0 function A(..., &x, ...); 這樣才對 但是不知道為什麼會在malloc出現錯誤= = ============================================================= typedef struct aaa{ int x; struct aaa* y; }AAA; AAA* node = (AAA*) malloc( sizeof(AAA) ); 這行會 Segmentation fault 用GDB backtrace #0 0x00007ffff7ad4726 in ?? () from /lib/libc.so.6 #1 0x00007ffff7ad558e in malloc () from /lib/libc.so.6 不懂這什麼意思 卡在這裡很久了 請問要怎麼解決這個問題呢? http://www.lslnet.com/linux/f/docs1/i46/big5317950.htm google到這個,跟我問題似乎很像,但還是不知道怎麼解...= =" -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.142.179.78

08/28 23:26, , 1F
我怎麼覺得是你 node->y 的地方有錯
08/28 23:26, 1F

08/28 23:27, , 2F
雖然不懂問題 但這樣寫看似很正確阿?正確寫法還會有機會錯嗎!
08/28 23:27, 2F

08/28 23:28, , 3F
如果這樣好恐怖的感覺 是什麼原因造成這樣的阿
08/28 23:28, 3F

08/28 23:29, , 4F
GDB 那裡應該是指 malloc 函數執行時出錯,久沒用 GDB
08/28 23:29, 4F

08/28 23:30, , 5F
malloc 的參數改成別的值試試
08/28 23:30, 5F

08/28 23:35, , 6F
有把size改成數字也是會錯...
08/28 23:35, 6F
※ 編輯: deepking 來自: 220.142.179.78 (08/28 23:36)

08/28 23:41, , 7F
會是之前已經malloc太多嗎? 2XXXX bytes
08/28 23:41, 7F
※ 編輯: deepking 來自: 220.142.179.78 (08/29 00:14)

08/29 00:18, , 8F
兩個都不對...囧
08/29 00:18, 8F

08/29 00:19, , 9F
區域變數離開 function 就被釋放了
08/29 00:19, 9F
變數X是在更前面的function,偷懶XD 用迴圈 call B, B在call C

08/29 00:58, , 10F
int* x; 這個指標沒有指向某個變數,垃圾值是不能拿來
08/29 00:58, 10F

08/29 00:59, , 11F
dereference 的,新手十二誡之三
08/29 00:59, 11F

08/29 01:13, , 12F
func.A裡面,參數帶入了x,但卻完全沒拿來用?!
08/29 01:13, 12F
sorry,只把部份 code 打出來

08/29 01:37, , 13F
malloc() 這種東西會出錯,唯一可能性就是之前破壞 heap
08/29 01:37, 13F

08/29 01:37, , 14F
又或者說,是破壞 heap management 用途的結構。
08/29 01:37, 14F

08/29 01:38, , 15F
就像你不小心 pointer 亂指把 linked list 的 next 指到
08/29 01:38, 15F

08/29 01:38, , 16F
莫名其妙的地方去,當下還不會出錯。但是後來你單純只是
08/29 01:38, 16F

08/29 01:38, , 17F
順順地從 list 的頭走到尾,就出事了。
08/29 01:38, 17F

08/29 01:39, , 18F
修上上句:「把 linked list 內某個 node 的 next 指到」
08/29 01:39, 18F

08/29 01:40, , 19F
會把程式碼debug到這地步 我想程式已經相當龐大了
08/29 01:40, 19F

08/29 01:44, , 20F
也許是你假設一個struct的field有資料 於是你用了他且free
08/29 01:44, 20F

08/29 01:45, , 21F
但事實上從沒將該field assign資料過
08/29 01:45, 21F
一開始是 int* x; x = 0; (換成*x=0; 錯就跑到這行了 所以是這樣破壞heap ? ※ 編輯: deepking 來自: 220.142.178.127 (08/29 08:38)

08/29 09:57, , 22F
你用位置0的指標X進去,有要做什麼嗎?
08/29 09:57, 22F

08/29 09:59, , 23F
打錯,不是位置零,但你沒有賦予位置,還去把他設值
08/29 09:59, 23F

08/29 09:59, , 24F
可能會記憶體存取錯誤
08/29 09:59, 24F

08/29 10:15, , 25F
就像t大所說, x可能指到malloc管理記憶體會用到的欄位
08/29 10:15, 25F

08/29 10:16, , 26F
因為他是垃圾值, 所以只是「可能」,所以造成malloc無
08/29 10:16, 26F

08/29 10:17, , 27F
法正常運作
08/29 10:17, 27F

08/30 22:20, , 28F
aaa的宣告拿來看一下唄
08/30 22:20, 28F

08/30 22:21, , 29F
眼殘囧
08/30 22:21, 29F
文章代碼(AID): #1CUISbGF (C_and_CPP)
文章代碼(AID): #1CUISbGF (C_and_CPP)