6
回答
C语言结构体指针问题

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)



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

<无标签>
举报
西南茂
发帖于3年前 6回/415阅
共有6个答案 最后回答: 3年前
你检查下你的for循环很有可能是越界了。造成from为野指针
--- 共有 1 条评论 ---
西南茂int N = 9; int n; for(n=0;n<N-1;n++){ copyExp(&f[n+1], f[n]); // 大概是这个样子,应该不是越界的问题啊 } 3年前 回复
艹,指针让你到处丢,不段错误才怪了。谁教的你 from = from->next; 这种写法。之前申请的 from 内存哪去了
--- 共有 1 条评论 ---
西南茂from是形参啊,只是一个拷贝应该可以这么用的吧 3年前 回复


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

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

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

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

很有可能是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]没有被初始化,是个野指针,下次循环的时候就报错了...

顶部