ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码

C中Segmentation fault的总结

来源:网络整理     时间:2015-12-20     关键词:

本篇文章主要介绍了"C中Segmentation fault的总结",主要涉及到方面的内容,对于其他编程jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下: Segmentation fault的错误表示访问了不该访问的内存片段(个人一点浅薄的理解哈~~)。我与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

以上就介绍了C中Segmentation fault的总结,包括了方面的内容,希望对其他编程jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播有兴趣的朋友有所帮助。

本文网址链接:http://www.codes51.com/article/detail_253147.html

相关图片

相关文章