我试图向朋友解释免费的工作原理,所以我考虑了以下代码示例以尝试对其进行解释(很复杂,我知道):
#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吗?保留价值有什么意义?还是我只是不了解某事?
不应该释放...释放该内存
假设您的公司决定移动您的工作区,因此他们为您分配了一张新办公桌,并取消了您现有的办公桌。他们会立即清理您的旧办公桌吗?可能不是,除非他们立即需要它。如果回去检查抽屉,您可能会发现您留在那儿的口香糖,或者可能没有。您的空间已被释放,但这并不意味着它立即被清除或消失。不再是您的空间了。
不应该释放...将指针设置为null吗?
free
获取指针的副本,因为指针是按值传递的。free
无法擦除您持有指针的变量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句