2012-01-03 192 views
1

下面是源代码的一小部分,其中fclose导致错误?这个函数并不总是被调用,在某些特定的条件下调用这个函数。fclose导致分段错误?

int write_into_file (char * file_name) 
{  
    FILE * fp = NULL ; 

    if (file_name == NULL) 
    { 
     return FAIL ; 
    } 

    if ((fp = fopen (file_name , "r")) == NULL) 
    { 
     if ((fp = fopen (file_name, "w")) == NULL) 
     { 
      return FAIL ; 
     } 
    } 
    fclose (fp) ; 
    fp = NULL ; 

    return SUCESS; 

} 

我们将大小为1024的字符缓冲区传递给file_name。 请谁能告诉我为什么fclose会导致分段错误?

+4

试图通过'gdb'或'valgrind'作为开始运行它。代码看起来没有什么问题,所以你应该提供尽可能多的关于崩溃的信息。 'fclose()'似乎不太可能是真正的罪魁祸首。 – 2012-01-03 19:00:50

+1

字符缓冲区空终止?字符缓冲区是一个有效的文件名?为什么你打开文件阅读,然后尝试打开它写入,如果失败? – 2012-01-03 19:01:14

+0

的可能的复制[FCLOSE()导致分段错误](http://stackoverflow.com/questions/1443164/fclose-causing-segmentation-fault) – 2015-11-13 22:22:14

回答

4

我看不出有任何可能的方式是fclose可以在这里造成段错误,我认为你的问题在于其他地方的计划。

这可能是可能的堆栈得到了其他地方损坏,该Bug显示当fclose被调用。我建议你再次检查一下你的其他源代码,然后用调试器/内存分析器仔细观察会发生什么。

我可以看到,可能会导致错误的唯一的另一件事是file_name没有空值终止。

+0

感谢您的答复。是的,file_name已被空终止。我想我必须与valgrind进行核对。 – sach 2012-01-03 19:10:29

2

没有与FCLOSE没有问题的()。问题可能出在您将file_name与NULL进行比较,或者可能与代码的其他部分有关。