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后,程序终于正常了。
最后,记念一下个人这份代码: