{
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。页换出去了才会发作
会员注册
会员登录
个人空间