该指针如何为null而不是同时为null?

1 c pointers

我遇到了这个奇怪的问题.基本上我有一个循环永远循环,在该循环的开始我打开一个文件,我写了一些东西到文件,然后在循环结束我关闭文件.适用于循环的第一次迭代,但在第二次迭代中我得到

*** glibc detected *** ./prog: double free or corruption (top): 
Run Code Online (Sandbox Code Playgroud)

fclose(data)在循环的第二次迭代期间,我已将其缩小到该行.显然,当您释放不止一次的内容时会发生此错误,但在此代码中该怎么可能?

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

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

    if (data != NULL)
    { 
        fclose(data);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

 data = NULL;
Run Code Online (Sandbox Code Playgroud)

能比我更精通C的人能解释一下这里发生了什么吗?

Sup*_*man 9

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