[我试图向朋友解释免费的工作原理,所以我想到了下面的代码示例尝试对其进行解释(我知道,很复杂):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *stringPtr = NULL;
//Pass the size of the string in bytes to malloc
stringPtr = (char *)malloc(10 * sizeof(char));
strcpy(stringPtr, "A String. ");
printf("%s", stringPtr);
free(stringPtr);
printf("%s", stringPtr);
return 0;
}
[认为这段代码将释放分配在堆上的内存,我假设如果我随后打印出分配给指针的字符串,那么它将做一些奇怪的事情或使程序崩溃,因为我认为它将尝试输出一个空值;但是,当我运行它时,它最终只输出了两次字符串。我想我会逐步了解它的原因,因为在我看来,也许它将字符串复制到堆栈或其他内容中,然后指针将指向一个新的内存地址,而旧内存毕竟被清理了(并不是那种情况会有意义,但是,嘿,我不知道那还会是什么),但是当我单步执行代码时,不仅没有释放内存,指针实际上仍然指向相同的位置。内存地址和具有相同的值。
当我调查它时,人们说您需要在调用free之后为指针分配一个空值,但是我的问题是为什么?不应该只释放该内存并将指针设置为null吗?保留价值有什么意义?还是我只是不了解某事?
不应该释放...释放该内存
假设您的公司决定移动您的工作区,因此他们为您分配了一张新办公桌,并撤消了您现有的办公桌。他们会立即清理您的旧办公桌吗?除非他们立即需要,否则可能不会。如果您回去检查抽屉,您可能会发现您留在那儿的口香糖,或者可能没有。您的空间为已分配空间,但这并不意味着它会立即为[[已清除或已消失。不再是你的空间了。
不应该释放...将指针设置为空吗?
free
获取指针的副本,因为指针是按值传递的。 free
无法擦除您持有指针的变量。]>
free
函数获取指针值