C中Segmentation fault的總結

Segmentation fault的錯誤表示訪問了不應訪問的內存片斷(我的一點淺薄的理解哈~~)。git

我與Segmentation fault的故事是這樣的:github

一開始,先定義數據結構:數據結構

typedef struct TreeNode *BinTree;
struct TreeNode{
	char *data;
	BinTree left;
	BinTree right;
} ;

而後寫了個function進行初始化:函數

BinTree createChildTree(BinTree tree, char *left_data, char *right_data){
	if(left_data){
	        // 注意啦,我這的sizeof給的是BinTree。。。。
		BinTree left = (BinTree) malloc(sizeof(BinTree));
		left->data = left_data; 
		left->left = NULL; left->right = NULL;
		tree->left = left;
	}
	if(right_data){
		BinTree right = (BinTree) malloc(sizeof(BinTree));
		right->data = right_data; 
		right->left = NULL; right->right = NULL;
		tree->right = right;
	}
	return tree;
}

 

當編譯經過後,我滿心歡喜的執行這段代碼...固然了,SF出來了。。google

因而乎,google了這個錯誤的含義。。瞬間以爲好悲劇。。code

還好我心裏強大,硬生生的一條一條語句註釋檢查,發現當兩次調用createChildTree函數後,TreeNode裏面的數據會是亂碼,當時覺得建立left活着right節點的時候沒有進行初始化。內存

然而,代碼中已經明顯的進行了初始化呀。。。get

這回,我感受掉進了一個黑屋子裏,至關大無助。it

後來,發現printf sizeof BinTree輸出的是8個字節,而printf sizeof TreeNode 倒是32個字節io

我突然想到了什麼,

是的。。申請的內存空間小於結構體的空間大小

而賦值的數據超出了malloc的內存片斷,因此產生了SF的錯誤

當malloc中sizeof的參數改爲TreeNode後,程序終於正常了。

最後,記念一下個人這份代碼:

tree  traversal previously

相關文章
相關標籤/搜索