C-free函数释放某个分配的指针后,为什么还会死可以使用这个指针,指向的内容也没有变化

发布于 2016-10-15 10:18:24 字数 418 浏览 1799 评论 7

#include<malloc.h>
#include<stdio.h>

int main()
{
char *p = (char *)malloc(sizeof(char)*100);
if(p !=NULL)
{
int i;
for(i=0;i<99;i++)
{
p[i]='a';
}
p[i]='';
}

printf("%sn",p);
free(p);
if(p !=NULL)
{
printf("%sn",p);
}

return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

泛泛之交 2017-08-19 21:45:39

1、free了申请的内存后,内存被回收,这样以前的指针p就成为悬垂指针,如果没有为p赋新值,则指针p的值不会被改变;
2、虽然p指向的内存被回收,但是如果没有被分配给其他的程序使用并且覆盖,那么这部分内存的内容是不会被修改的,所以,仍然可以通过p指针访问它,并且发现其中的值未被改变;当然,如果被其他程序占用了,就可能出现访问非法的异常了。
3、因此free指针之后,最好的做法,是将p赋为空指针,即p=NULL。

浮生未歇 2017-05-06 19:56:50

free只是告诉操作系统这块内存可以我不用了,其他人可以使用,这块内存的内容可能会改变,取决与是否有别的人使用这块内存,所以一般free之后都会p=NULL。

晚风撩人 2017-04-17 13:50:45

你在free(p)之后,最好加上p = NULL;

要不然容易导致野指针。你在free(p)之后,你只是使用
if(p != NULL)
你想的是用来进行防止误用操作对吧。。

你进入了一个误区,误认为free(p)之后,p就指向了NULL,而其实不然。

free(p)的言外之意就是告诉编译器:大家注意啦哈,这块内存我现在不用了,你们谁想用就拿去用哈。而p在这里你可以完全理解成就是这块内存的地址,也就是告诉编译器,这块内存现在不被占用了,而里面的内容此时就是我们所说的“垃圾”,因为作为主人的我已经丢弃它了,里面的内容就是不可控的。

注意p是个地址,你没有强行置为空,那还是原来的那个值。只是里面的内容不受控啦,有可能不会变,有可能会被改写,而结果是未知的。

灵芸 2017-01-25 18:17:43

free(p) 函数只是把 p 指向的那块内存的使用权归还给系统,系统可以把它分配给其他需要使用这块内存的地方。其实是系统维护着一个内存表,在回收内存的时候在上面加一个标记表面这块内存的使用权归属,并不会改变这块内存的值,更加不会改变指针 p 的值。
而有人说为什么不在 free 函数中加上 p = NULL; 这是不对的,free 函数的作用就是回收内存,不应该做超出它应该做的事情之外的事。
我们经常在 free 之后会添加一句 p = NULL; 这个只是我们约定俗成的一种做法,那是因为地址编号为 0 的内存永远不会被系统分配出去,所以我们就把这个值作为一个标记值。
如果系统有另外一个永远不会被分配内存,那我们也可以用那个内存地址作为我们的标记值。

灵芸 2016-12-22 07:38:08

free(p)只是说释放p所指向的那块内存,但P的值并没有变化,仍然指向之前的那个位置。
如果那块内存没有被其他应用程序改写,内容就没有发生变化。
所以安全的做法就是 释放后,P=NULL。

清晨说ぺ晚安 2016-11-02 21:36:24

我编译运行了这段代码,但是输出结果我发现每次free掉p以后,p指向的内容有所改变,值为-18. 不知道这个值有没有什么特别的含义。

夜无邪 2016-10-22 15:29:18

基本上就是楼上几位解释法的那样

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文