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

相关文章
相关标签/搜索