以下是函数的一部分。
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");
我得到分段错误,但是如果我保留它就会运行并转到嵌套函数等等。
所以我的问题只是为什么会发生这种情况,我知道我没有显示足够的代码,所以你可以看到为什么分段发生了,但是如果有任何一般的解释,我也在另一个放在我的程序中,但最后我可以删除它?
关心Orri
答案 0 :(得分:3)
就标准而言,对调用未定义行为的程序所做的任何更改都可以产生任何结果 - 不一定是它背后的逻辑。实际上,当遇到未定义的行为时,尝试推断给定实现的行为是非常有成效的。
如果对printf
(或任何其他功能)的调用改变了你的程序的行为(当然,除了明显的打印应用之外),一个可能的解释是你有一个无效指针指向超出范围的局部变量。如果该变量以前存在于printf
现在用于其自身局部变量的堆栈内存中,则意味着指针指向的内存现在将被新值覆盖。这当然可以改变使用指针的任何代码的行为。