理解自由的概念

时间:2011-03-21 12:00:05

标签: c memory allocation

尝试以下代码:

#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的概念。任何帮助都是有价值的。

6 个答案:

答案 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函数,或者如果   空间已被呼叫解除分配   为了释放或重新分配,行为是   未定义