C中Segmentation fault的总结

Segmentation fault的错误表示访问了不该访问的内存片段(个人一点浅薄的理解哈~~)。

我与Segmentation fault的故事是这样的:

一开始,先定义数据结构:

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了这个错误的含义。。瞬间觉得好悲剧。。

还好我内心强大,硬生生的一条一条语句注释检查,发现当两次调用createChildTree函数后,TreeNode里面的数据会是乱码,当时以为创建left活着right节点的时候没有进行初始化。

然而,代码中已经明显的进行了初始化呀。。。

这回,我感觉掉进了一个黑屋子里,相当大无助。

后来,发现printf sizeof BinTree输出的是8个字节,而printf sizeof TreeNode 却是32个字节

我忽然想到了什么,

是的。。申请的内存空间小于结构体的空间大小

而赋值的数据超出了malloc的内存片段,所以产生了SF的错误

当malloc中sizeof的参数改成TreeNode后,程序终于正常了。

最后,纪念一下我的这份代码:

tree_traversal_pre.c


你可能感兴趣的:(fault,segmentation)