2014-07-23 46 views
-1

自己編寫的程序,並且我已經建立這種結構波段故障使用malloc()用C

struct position_found 
{ 
int row; 
int column; 
struct position_found *next; 
}; 
typedef struct position_found position_found, *position_found_ptr; 

,然後我使用該函數來創建一個新的節點類型position_found

position_found_ptr new_position_found_node(int row, int column) 
{ 
position_found_ptr x; 

x=(position_found_ptr)malloc(sizeof(position_found)); 
if(x==NULL) 
{ 
    printf("out of memory"); 
    exit(2); 
} 
x->row=row; 
x->column=column; 
x->next=NULL; 
return x; 
} 

的問題在於x =(position_found_ptr)malloc(sizeof(position_found));提供seg錯誤,但是如果我在此之前打印某些東西,例如printf(「k」),malloc將正常工作,並且我的程序將繼續。我試過在測試程序中使用它自己的功能,它完美地工作。你有什麼想法發生了什麼?

+3

是的,您在程序中調用了未定義的行爲。 –

+2

你有沒有包含stdlib.h? –

+0

通過'valgrind'或其他內存調試器運行你的代碼。它應該可以幫助你追蹤真正的問題。 – FatalError

回答

0

,如果你想,把你的整個代碼,所以我可以使用gdb調試它(或者你可以自己做):d

但對於你的第二個問題的答案: 的原因是,當你運行程序,有一些內存大小(除了你的變量和其他東西)它的操作系統! 如果您在使用內存時遇到問題(如您的代碼),您會遇到分段錯誤! 但是當你添加一些代碼行時,這改變了寫入存儲單元的數據順序,這樣你的剩餘代碼就不會寫在非法存儲單元上了! :D

例如: 如果在添加printf(「k」)之前;你在x1234這是非法的,因爲你有seg故障,添加後,你繼續x4323,所以這是合法的,一切正常:D

你可以使用「gdb」來「反彙編」檢查我說的是什麼:D!

+0

非常感謝您的回答:D我問,因爲它看起來很奇怪發生了什麼,我不知道爲什麼。我會嘗試使用gdb進行調試,如果這不起作用,我會發布我的整個代碼,希望得到你的幫助:D – Raven