2013-01-05 24 views
0

以下是函数的一部分。printf防止c中的段错误

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(奥瑞)

+6

某处可能存在未定义的行为。一个简短的,完整的样本,表明问题将不胜感激。 – chris

+1

询问“如何防止分段故障”并不是一个有用的精神状态。分段错误是编程错误的结果,并且询问“如何防止错误”是没有意义的。你应该问“如何正确地写XYZ”,事实上,你甚至可以忽略“正确”,因为没有别的。所以只是“我如何使用printf?”。 –

+3

我的猜测是在程序的另一部分覆盖了内存。删除printf并开始删除其他内容,直到问题消失。然后,您可以开始缩小事情发生错误的地方。 – dutt

回答

3

至于标准有关调用未定义行为可以有任何结果的程序所做的任何更改 - 有没有被它背后的逻辑。事实上,在遇到未定义的行为时,试图推断给定实现的行为方式很少有成果。

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