"free"干了什么?

wenyanshan110 2004-08-18 10:02:18
请看下面程序:
·
#include<stdio.h>
#include<stdlibh>
main()
{int *p;
p=(int *)malloc(sizeof(int));
printf("input the value:\n");
scanf("%d",p);
free(p);
printf("p is %d",*p);
return;
}
为什么还是可以访问p?
...全文
205 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ehhl 2004-08-18
  • 打赏
  • 举报
回复
所谓的内存分配,打个比方,有一栋大楼,所有的房间就是内存,要分配的时候就是向大楼申请空闲的房间,如果已经住满,那么分配失败,(return null)。否则,按照你需要的数量,比如申请5个房间,那么大楼就会告诉你5个房间中第一个房间的房间号码。等你free内存的时候,就相当于告诉大楼,这5个房间不用了,如果有别人来住,那么就可以给别人住了。
nicknide 2004-08-18
  • 打赏
  • 举报
回复
是对的啊,你在VC的环境下用调试模式看看,看是不是对的,VC调试模式下,内存回收后默认都把那块内存地址内容写为0xcd,呵呵,那样你的东西就不对了
cxy815 2004-08-18
  • 打赏
  • 举报
回复
free只是释放内存空间,表示p已不再“占有”该内存。只有在令p=null之后p值才无法访问。
liubingqian 2004-08-18
  • 打赏
  • 举报
回复
free只是告诉操作系统:参数p所指向的堆内存空间现在不用了,可以被别的程序所使用。并不是说该空间被清零,以前是什么内容还是什么内容,除非有应用程序对该内存进行了修改。
p作为一个局部变量在函数执行期继续存在。
良好的风格在free(p);后应该p=NULL;
wenyanshan110 2004-08-18
  • 打赏
  • 举报
回复
to(bm1408(当UP成星时,我就......继续UP!我会找到媳妇吗(:因为) )
输出是对的!
wenyanshan110 2004-08-18
  • 打赏
  • 举报
回复
谢谢!
bm1408 2004-08-18
  • 打赏
  • 举报
回复
这里要区别指针和批针的指向!

int *p;//P本身是一个变量!有效期是MAIN函数体
free(p);//他只是提示OS把他分配的这段动态内存再次收回!
P变成了野指针!

printf("p is %d",*p);//谁他妈知道他输出的是什么东东呢!
积木 2004-08-18
  • 打赏
  • 举报
回复
free标志那块内存可以被重新写,而不是由这个程序锁定,只由这个程序改写
所以在别的程序没有修改这块的时候你还是可以访问,释放不一定就非得清零。
但是现在你这么访问是很危险的,因为结果实际上应该是不确定的,但是这个程序是看不出来的
ehhl 2004-08-18
  • 打赏
  • 举报
回复
用malloc分配一块内存,os就会从自己维护的堆里取出来给用户。在VC的目录下可以找到的吧,是不是malloc.c?
ehhl 2004-08-18
  • 打赏
  • 举报
回复
究竟属于什么范畴不知道,但是,必须要操作系统协作是肯定的。象在window平台上用malloc,window就提供了内存分配的接口,因为os本身维护着系统的内存池,
iorchis 2004-08-18
  • 打赏
  • 举报
回复
关注 boyb() 所提问题中ing.......
你我他111 2004-08-18
  • 打赏
  • 举报
回复

那要是没有操作系统的内存管理(在嵌入式开发中,可能就没有操作系统),类似于alloc(),malloc(),new()这些内存分配函数是不是就不能用了?
进一步,这些关于内存的函数是属于语言的范畴,还是必须要操作系统的协作才能完成?
望高手指点!!
cxce 2004-08-18
  • 打赏
  • 举报
回复
同意楼上的!

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧