printf防止c中的分段错误

printf防止c中的分段错误,c,segmentation-fault,C,Segmentation Fault,以下是函数的一部分 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(“防止seg故障”\n)我得到分段错误,但如果我保持它运行并转到嵌套函

以下是函数的一部分

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(“防止seg故障”\n)我得到分段错误,但如果我保持它运行并转到嵌套函数等等

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


关于Orri,就标准而言,对调用未定义行为的程序所做的任何更改都可能产生任何结果-不必有逻辑支持。事实上,当遇到未定义的行为时,试图对给定实现的行为进行推理是很少有成效的


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

就标准而言,对调用未定义行为的程序所做的任何更改都会产生任何结果——不必有逻辑支持。事实上,当遇到未定义的行为时,试图对给定实现的行为进行推理是很少有成效的


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

可能在某些地方存在未定义的行为。一个简短、完整的例子来证明这个问题是值得赞赏的。问“如何防止分割错误”不是一个有用的心理状态。分段错误是编程错误的结果,询问“如何防止错误”是没有意义的。您应该改为询问“如何正确地编写XYZ”,事实上,您甚至可以省略“正确”,因为没有其他内容。所以,只要问“我如何使用printf?”。我猜是在程序的另一部分中覆盖了内存。移除printf并开始移除其他内容,直到问题消失。然后你就可以开始精确地缩小出错的地方了。谢谢你,我会像dutt建议的那样缩小范围,Kerrak,我现在在做这个作业时没有处于有用的精神状态:=),但你是对的。如果我不能弄清楚这一点,我可能会提供更多的细节,这是我第一次使用链表和这么多结构进行编程。可能在某些地方有未定义的行为。一个简短、完整的例子来证明这个问题是值得赞赏的。问“如何防止分割错误”不是一个有用的心理状态。分段错误是编程错误的结果,询问“如何防止错误”是没有意义的。您应该改为询问“如何正确地编写XYZ”,事实上,您甚至可以省略“正确”,因为没有其他内容。所以,只要问“我如何使用printf?”。我猜是在程序的另一部分中覆盖了内存。移除printf并开始移除其他内容,直到问题消失。然后你就可以开始精确地缩小出错的地方了。谢谢你,我会像dutt建议的那样缩小范围,Kerrak,我现在在做这个作业时没有处于有用的精神状态:=),但你是对的。如果我不能弄清楚这一点,我可能会提供更多的细节,这是我第一次使用链表和这么多结构进行编程。