0

下面是一个函数的一部分。

l->length[l->cl] = atoi(p->wds[p->cw]);
printf("FD %d\n", l->length[l->cl]);
p->cw = p->cw + 1;
l->cl = l->cl + 1; 
printf("prevent from seg fault\n");
instr(p);

如果我删除printf("prevent from seg fault\n");我得到分段错误,但如果我保持它运行并转到嵌套函数等等。

所以我的问题是一般为什么会发生这种情况,我知道我没有显示足够的代码,所以你可以看到为什么会发生分段,但是如果对此有任何一般性解释,我在我的另一个地方也有这个程序,但最后我可以删除它吗?

问候奥里

4

1 回答 1

6

就标准而言,对调用未定义行为的程序所做的任何更改都可能产生任何结果——其背后不必有逻辑。事实上,当遇到未定义的行为时,尝试推理给定实现的行为方式很少有成效。

也就是说,如果对printf(或任何其他函数)的调用改变了你的程序的行为(当然,除了打印它应该做的明显变化之外),一种可能的解释是你在某个地方有一个指向本地的无效指针超出范围的变量。如果该变量以前存在于堆栈内存中,现在由printf它自己的局部变量使用,这意味着指针指向的内存现在将被新值覆盖。这当然可以改变任何使用指针的代码的行为。

于 2013-01-05T11:59:30.593 回答