赞助连接

赞助连接

阅 读 文 章

free()? 疑惑。。。

[来源:网上转载 (http://bbs.chinaunix.net) | 作者:网友(网络转载) | 时间:2008-06-14 | 浏览:人次 ]

struct _str_
{
   int a;
   struct _str_ *next;
} *p;

p=(struct _str_ *)malloc(sizeof(struct _str_));

p->a = 10;

printf("1.a value is %d\n",p->a);

free(p);

printf("2.a value is %d\n",p->a);

输出的结果:

1.a value is 10;

2.a value is 10;


问题:

<1>.当然,这时p是个野指针,free之后的,它指向垃圾数据,这个垃圾数据值可能是10,但为什么无论多少次运行程序,这个垃圾数据的值仍然都是10呢?

<2>另外,还有一个很奇怪的现象,就是把指针p固定为一个地址,比如:p=(struct _str_*)0x20094832,不用malloc分配内存,它居然还能给变量a赋值,也就是:p->a=99;这句
居然不会memory fault!!!我的想法是,是不是在一个进程中, *** 作系统已经为进程分配了一定的堆空间给该进程使用,然后p指向的是该堆中的内存呢??


说不定这个固定地址是栈的地址呢?




????


free之后,它指向的还是原来的内存空间,
只要你不重新使用原来的内存空间,
里面的数据不会变的。


to lenovo  

那这样的话,那块内存空间保存的数据什么时候才被清除?退出 *** 作系统才会清除?


被占用的时候


野指针
访问和赋值的结果都是未定义,不是肯定挂


我认为:楼主的例子不适用于野指针
野指针是指未初始化的指针(没有指定地址,而非给地址所指空间赋值)
malloc和free只这为指针分配空间
free只是将malloc分配的空间重新标为可以再分配
所以在没有再将malloc将这块空间分配之前,都可以使用该空间
当然,不同的平台有些许的不同,如支持虚拟内存的系统"可能"会将该空间所对应的物理页面释放


别浪费时间讨论具体野不野指针了,知道是错误的就可以了


错误是肯定的,是不是即时发作要看OS。页换出去了才会发作


TAG标签 : 空间 指针 分配 内存 free struct malloc _str_ 地址

最新评论 共有0位网友发表了评论

发表评论

评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名:(注册)
密码:
验证码:
匿名发表
网站地图友情连接交流论坛网站投稿广告服务联系我们留言本站长统计
Some rights reserved: www.chmhome.com, 鄂ICP备07010232号 E-mail:chinakafei@live.com,QQ:552766
中国咖啡技术网(Chmhome):国外编程技术书籍,中文编程手册,经典编程文章,交流技术,技术软件下载,计算机论文,毕业论文.