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後,程序終於正常了。
最後,記念一下個人這份代碼: