C语言结构体指针问题

西南茂 发布于 2015/10/29 21:29
阅读 415
收藏 0

ubuntu15.04环境下报错:段错误

涉及函数代码:

void copyExp(struct elem **head, struct elem * from){
	struct elem * result = (struct elem*)malloc(sizeof(struct elem));
	result->c = from->c;
	result->n = from->n;
	result->next = NULL;
	(*head) = result;
	from = from->next;
	while(from != NULL){
		struct elem *p = (struct elem*)malloc(sizeof(struct elem));
		p->c = from->c;
		p->n = from->n;
		p->next = NULL;
		result->next = p;
		result = p;
		from = from->next;
	}
}



上面是发生错误的地方,下面是调用的地方
copyExp(&f[n+1], f[n]);	// 将f[n]的值赋值给f[n+1]



单独调用这个函数没有任何问题,但是当我把上面这行代码放到for循环里面的时候,就报错了...

下面是我用gdb调试的错误信息:

Program received signal SIGSEGV, Segmentation fault.
0x00000000004010c6 in copyExp (head=0x7fffffffdbc8, from=0xf63d4e2e)
    at expression.c:31
31		result->c = from->c;
(gdb)



希望有大神可以帮忙解决,谢谢了。

加载中
0
莫扎特的代码
莫扎特的代码
很有可能是result分配内存出错,result为null,或者from为null?
西南茂
西南茂
是from的问题,我单独调用from->c;都要报错
0
风之轮
风之轮
你检查下你的for循环很有可能是越界了。造成from为野指针
西南茂
西南茂
int N = 9; int n; for(n=0;n<N-1;n++){ copyExp(&f[n+1], f[n]); // 大概是这个样子,应该不是越界的问题啊 }
0
义和团团中央书记
义和团团中央书记
用for来调用,,,,,主要是算法错了,另外malloc得考虑一下null
西南茂
西南茂
意思是malloc后先检查下result是不是null?
0
jQer
jQer
艹,指针让你到处丢,不段错误才怪了。谁教的你 from = from->next; 这种写法。之前申请的 from 内存哪去了
西南茂
西南茂
from是形参啊,只是一个拷贝应该可以这么用的吧
0
Ivnoidea
Ivnoidea


单看函数信息太少,你在函数体中,在堆中构造了一个与from一样的链表,将起始地址复制给head。

在看copyExp(&f[n+1], f[n]); f是一个链表头指针数组,不清楚你整个代码,你是想把在整个数组中每个元素都创建一个同样的链表

从错误来看要么是传入from并没有指向一个有效的元素,这个要看你循环是否有f越界的可能,要么是malloc失败了,这个问题一般不会出现,也许是你逻辑上的问题导致代码申请了过多的内存,或者是单纯你的内存需求太大了

0
西南茂
西南茂

引用来自“莫扎特的代码”的评论

很有可能是result分配内存出错,result为null,或者from为null?

问题解决了,确实是from为null造成的,我在for循环里面,有一个if语句,形式大概如下:

for(n = 0;n<N-1;n++){
		// n = 0;
		if(d[n] == 0){
			copyExp(&f[n+1], f[n]);	// 将f[n]的值赋值给f[n+1]
			//copyExp(&f[n+2], f[n+1]);
			//copyExp(&f[n+3], f[n+2]);
			/////////////////////////调试输出
			printf("f[%d]的c=%d, n=%d\n", n, f[n]->c, f[n]->n);
			//printf("f[%d]的c=%d, n=%d\n", n+1, f[n+1]->c, f[n+1]->n);
			//printf("f[%d]的c=%d, n=%d\n", n+2, f[n+2]->c, f[n+2]->n);
			/////////////////////////END OF DEBUG
			l[n+1] = l[n];	
		}else if(d[n] == 1 && isZero(l, n)){
			registerExp(&f[n+1]);
			addElem(f[n+1], 1, n+1);
			l[n+1] = n+1;
		}else if(d[n] == 1 && checkM(l, n)){
			m = getM(l, n);
			copyExp(&f[n+1], f[n]);
		}
		d[i+1] = getD(f[i+1], a, l[i+1], i+1);
	}



没有else,当条件都不满足的时候,当前的f[n+1]没有被初始化,是个野指针,下次循环的时候就报错了...

返回顶部
顶部