如果在C中将分配的内存设置为NULL,会发生什么

Dom*_*ner 5 c malloc free null dynamic-memory-allocation

在分配指针之前和之后将指针设置为NULL之间有区别吗?

例如,两者之间是否有任何区别

char* c = NULL;
Run Code Online (Sandbox Code Playgroud)

char* c = malloc(sizeof(char));
c = NULL;
Run Code Online (Sandbox Code Playgroud)

每个陈述的含义是什么(如果有的话),并且free(c)在每种情况下的召唤有什么不同?

Cin*_*nch 7

我们来看两个案例.

案例1:在malloc之前

嗯,这里几乎没有任何伤害.除非指针指向之前的某些内容,否则指针只会设置为NULL并指向任何内容.调用free()指向什么的指针什么都不做."解放人民?" 好的."免费免费?" 你不能真正释放那些已经"免费"的东西.没有陌生人,没有危险.继续...

案例2:在malloc之后

让我们分解一下:

char* c = malloc(sizeof(char));
c = NULL;
Run Code Online (Sandbox Code Playgroud)

第一个命令将为您的程序保留操作系统的内存.这是动态分配 - 动态获取更多内存.

第二个命令将指针设置为NULL.那是什么意思? 内存泄漏. 这意味着你的程序基本上从操作系统借用了内存而忘了它.这是一个很大的禁忌.如果程序一遍又一遍地执行,它们最终会崩溃(或整个系统崩溃).

就像你应该总是把东西归还给朋友一样,你应该总是将内存返回给操作系统.因此,你必须始终呼唤free()你的每一点malloc(); 就像在C或C++中打开和关闭方括号(),[]或{}一样.

永远不要将指针设置为NULL,直到你释放()与之关联的内存.


Edw*_*uck 4

在分配它之前,它可能包含(取决于声明的位置)垃圾数据。通过之前将其分配为 null,您基本上可以确保它处于已知的良好状态。

为变量分配并指定地址后,将指针设置为空意味着该指针将不再引用分配的内存。通常,这会导致内存泄漏(分配的一些内存无法再引用,因此无法释放)。然而,有时这是适当的。例如,如果您的逻辑有两个对内存的引用,一个用于分配/释放目的,一个用于“当前感兴趣的项目”,则可能适合分配当前感兴趣的项目,然后为其分配 null 作为此“当前项目” ofinterest”指针与内存分配和释放无关。

最后,如果它是一个用于释放的指针,那么在您使用free()该指针之后,您可能需要将该指针设置为 null,其原因与您在分配之前将指针设置为 null 的原因相同(以确保您的程序不会当指针中的地址值不是您想要访问的内存时,不要因为在指针中查找地址值而感到困惑)。