尝试以下代码:
#include<stdio.h>
int main()
{
int *p,*q;
p = (int *)malloc(sizeof(int));
*p =10;
q = p;
printf("%u \n",p);
printf("%u \n",q);
free(p);
printf("%u \n",p);
return 0;
}
输出结果如下:
[root@lnxdesk Tazim]# ./a.out
154804232
154804232
154804232
为什么即使我已完成free(p);
,p中的地址仍会打印?
那时free(p)
做了什么?
我想清楚地理解free / malloc的概念。任何帮助都是有价值的。
答案 0 :(得分:5)
free()
只释放堆上的内存。它不会更改指针的值。如果你试图打印指针指向的内存,你可能会得到某种垃圾。
另外,当你调用free
时,你给它指针,而不是指针的地址,所以free
不能改变你的指针......
答案 1 :(得分:3)
这是未定义的行为 - 一旦你free
指针存储的地址变得无效而你can't do anything with it - 不仅你不能取消引用它,你甚至不能{{1}指针值。
答案 2 :(得分:2)
您正在打印指针,即为您分配的内存区域的地址。使用free
释放内存区域不会将指针的地址设置为0x00,因为我认为您期望。
它只是告诉操作系统内存区域再次可用以供将来重复使用。
如果您在*p
之后打印free(p)
,则会遇到问题。
答案 3 :(得分:1)
malloc()
及其保留空间位于称为“堆”的内存存储区中,并返回指向该保留区域的指针。因此,在上面的示例p
中,给出了一个指针,可能是一个为其使用而保留的四字节内存区域(这次的地址恰好是154804232)。执行*p = 10
时,您现在将整数值10
放入指向的内存中。执行q = p
时,您现在使q
指向同一块保留堆内存。
free()
及其同类取消保留内存。当你致电free()
时,你说“我不再使用这个记忆了”。所有free()
都告诉内存管理系统现在可以再次使用内存块。 它强调不更改指针。它只是表示内存块可用。之后,您需要确保不再使用该指针。
如果你再次使用该指针,它可能正常工作。一旦。或两次。或者一千次。基本上它会正常工作,直到你使用它之后,其他人声称你所说的内存块是免费的并且用它做了些什么。当发生这种情况时, Bad Things Happen&lt; tm&gt; 。请不要让坏事发生。
答案 4 :(得分:0)
记住:指针只是一个地址。在你的malloc之前,之后,或者免费,它会给你相同的结果。 malloc()唯一做的就是在这个地址保留空间。 free唯一能做的就是释放它(最有可能的是,将此地址标记为可用于存储其他内容,“清理”将非常耗时)。 这就是为什么在free之后将指针指向NULL是一个好主意;因为你可以确定指针是否连接到某个东西。
答案 5 :(得分:0)
free does not reassign the pointer指向别的东西。实际上是C标准 没有提到用指针做任何事情。这就是描述中的所有内容:
自由功能导致空间 ptr指出要解除分配, 也就是说,可用于进一步 分配。如果ptr是空指针, 没有动作发生。否则,如果 参数与指针不匹配 早先由calloc返回, malloc,或realloc函数,或者如果 空间已被呼叫解除分配 为了释放或重新分配,行为是 未定义