【发布时间】:2017-03-04 05:16:48
【问题描述】:
我一直在运行一些测试,试图了解free() 函数的工作原理。这是我的代码,后面是一些基于我理解的问题。
int n=0,i=0;
scanf("%d",&n);
int *A = (int*)malloc(n*sizeof(int));
for (i=0;i<n;i++)
{
A[i]=2*i;
printf("A[%d] = %d\n",i,*(A+i));
}
printf("Address of A is = %d\n",A);
free(A);
for (i=0;i<n;i++)
{
printf("%d\n",*(A+i));
}
printf("Address of A is = %d\n",A);
我不明白为什么free(A)之后,A的值还是一样的?免费后不应该有一些垃圾价值吗?为什么A的地址保持不变?释放 A 的内存后究竟发生了什么?
【问题讨论】:
-
为什么不应该这样呢?如果你把垃圾放进罐子里,它不会消失,直到推车把它拿走,或者邻居用一些石头代替它。
free不会故意丢弃已释放的内存。当其他一些进程被分配相同的内存时,就会发生这种情况。A的地址也保持不变。free无法改变这一点。如果你想让它失效,你必须自己分配A = NULL。 -
但我不明白的是,为什么你要访问你告诉系统不再属于你的内存,并期待任何有意义的结果。
-
您为什么希望内存发生变化?如果您从记事本中取出一张纸,在上面写下便条,然后将纸扔进垃圾桶,那么便条上的文字不会神奇地从页面上消失。
-
请注意,打印指针的正确方法使用
"%p"转换规范(并将参数转换为void *),或使用转换为uintptr_t(来自<inttypes.h>)和转换规范,例如"0x%.16" PRIXPTR。只有在sizeof(int) == sizeof(void *)时才使用%d,这在 32 位系统上通常是正确的。 -
@KenWhite:这个类比可以进一步扩展,它仍然有效 - 文字不会消失,但是如果你扔掉这么大的纸条,你必须清空垃圾桶(将内存返回到操作系统),它也可能有。纸条上可能还有字迹,但您无法阅读,因为它在垃圾车(操作系统管理的内存池)内,而垃圾人不会让您爬进去检查(您没有读取权限到您的进程不拥有的内存)。如果您尝试,他们的垃圾人会毫无意义地殴打您(段错误)。 :-)