2012-05-29 20 views
1

我遇到了这个奇怪的问题。基本上,我有一个循环,永远循环,在循环的开始,我打开一个文件,我写了一些东西的文件,然后在循环结束我关闭文件。工作正常循环的第一次迭代,但在第二次迭代,我得到该指针如何在同一时间为空而不为空?

*** glibc detected *** ./prog: double free or corruption (top): 

循环的第二次迭代期间,我已经缩小下来到fclose(data)线。显然这个错误发生在你不止一次释放某些东西的时候,但是在这段代码中怎么可能呢?

while(1) 
{ 
    if (data == NULL) 
    { 
     data = fopen(data_path, "w+"); 
    } 

    /* do a bunch of stuff... */ 

    if (data != NULL) 
    { 
     fclose(data); 
    } 
} 

陌生人的事情是,如果我fclose(data)后添加以下行的程序运行得很好,没有任何问题:

data = NULL; 

可别人谁是更好地精通用C比我解释一下这是怎么回事在这?

+1

用valgrind运行你的程序,它会自动告诉你它有什么问题。 –

+1

在'data'上调用'fclose'不会*使数据变成NULL指针;实际上,它不会(也不能)根本改变'数据'*的值。它所做的是导致不再是数据指向的内存位置的FILE对象。 – zwol

回答

9

fclose不会使文件指针为NULL。 它只需关闭文件。 因此,在第二次迭代中,文件未打开,因为数据不是NULL。

+0

啊..好的,这是有道理的。但在我的主循环中,我正在使用fprintf多次写入文件指针,如果我正在尝试写入已关闭的文件指针,fprintf是不是应该抱怨? – user1419670

+0

你应该检查fprintf的返回值。另外,fprintf不知道文件是否关闭。它只是试图将字符转储到文件指针。 – Superman

+0

好的感谢使完美的感觉 – user1419670