C中的奇异/随机Segfault

时间:2009-12-13 01:47:51

标签: c segmentation-fault

编辑:澄清。

  • fout是一个FILE *。 (我认为这是无关紧要的,因为该行明确编译)
  • 在最后几行之上有很多代码;我想我可以抛弃它们,但我想你对调试我的东西不是太感兴趣了。一般来说,我更感兴趣的是,在返回0但不是之前会发生段错误。

警告:我的C太糟糕了。

我有一个C程序,从喜欢它,只是想要到段错误。我会饶你其他的,不相关的细节,但这是大局:

我的代码:

//...other code
printf("finished \n");   
fclose(fout);   
printf("after fclose \n");  
return 0;

输出:

  

完成
  在fclose之后   分段错误

我正在使用GCC进行编译,-std = c99。

我的问题:

这怎么可能呢?我应该注意什么,这可能导致这个(看似随机的)段错误?有什么想法吗?

非常感谢!

4 个答案:

答案 0 :(得分:9)

无论return返回的是什么导致了错误。如果此代码段位于main()中,则代码会对堆栈造成损害,最有可能超出变量的范围。例如

int main ()
{
    int a [3];
    int j;

    for (j = 0;  j < 10;  ++j)
         a [j] = 0;
    return 0;
}

这种事情可能导致许多无法解释的症状,包括段错误。

答案 1 :(得分:2)

由于它可能是与堆栈损坏相关的问题,您还可以使用内存调试器来查找损坏的来源,例如valgrind。 只需使用gcc -g进行编译,然后运行valgrind yourprog args

答案 2 :(得分:1)

“Hello world!”程序段错误?如果是这样,那么你有硬件问题。如果没有,那么您在代码中至少有一个问题没有向我们展示!

答案 3 :(得分:0)

使用调试标志gcc -g编译您的程序,并在gdb中运行您的代码。当执行有问题的代码或相对于其他输出时,您无法始终信任控制台输出“分段错误”。在许多情况下,这会产生误导 - 您会发现gdb等调试工具非常有用。