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

What Happens If You Set Allocated Memory To NULL in C

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

例如

有什么区别吗
char* c = NULL;

char* c = malloc(sizeof(char));
c = NULL;

这些陈述中的每一个都有什么含义(如果有的话),在每种情况下调用 free(c) 有什么不同吗?

是的,有区别。第二个导致内存泄漏。

关于你的第二个问题,如果c = NULL,那么free(c)就没有效果。

您没有将分配的内存设置为 NULL,而是将 指针 设置为 NULL,以便它不再指向您分配的内存。当你在上面调用 free 时,你并没有释放你分配的内存,因为指针没有指向它。

这称为内存泄漏:您已经分配了一些内存,但您不再有指向它的指针,因此您无法释放它,因此内存将保持 "in use" 并且对其他人不可用程序,即使您实际上不再使用它。

对 NULL 指针调用 free 无效。

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

在为变量分配地址后,将指针设置为null意味着指针将不再引用分配的内存。通常这会造成内存泄漏(一些已分配的内存无法再被引用,因此无法释放)。然而,有时这是合适的。例如,如果您的逻辑有两个对内存的引用,一个用于分配/释放目的,另一个用于 "current item of interest",则分配当前感兴趣的项目然后将 null 分配给它可能是合适的 "current item of interest" 指针与内存分配和释放无关。

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

我们来看两个案例

情况 1:在 malloc 之前

好吧,这里几乎没有造成任何伤害。除非指针之前指向某物,否则指针将简单地设置为 NULL 并且指向任何内容。在指向任何内容的指针上调用 free() 不会执行任何操作。 “解放人民?”好的。 “免费免费?”你不能真正释放已经有点“免费”的东西。没有陌生人,没有危险。继续...

情况 2:malloc 之后

让我们分解一下:

char* c = malloc(sizeof(char));
c = NULL;

第一个命令将从操作系统为您的程序预留内存。这是动态分配——即时获得更多内存。

第二个命令将您的指针设置为 NULL。那是什么意思? 内存泄漏。这意味着你的程序基本上已经从操作系统借用了内存而忘记了它。这是一个很大的禁忌。如果一个程序一直重复这样做,它们最终会崩溃(或者整个系统会崩溃)。

就像你应该总是return给朋友的东西,你应该总是return内存给操作系统。因此,你必须总是调用free() 你的每一分 malloc();就像 C 或 C++ 中的左右括号 ()、[] 或 {} 一样。

在 free() 与之关联的内存之前,切勿将指针设置为 NULL。