读书人

关于内存释放的有关问题

发布时间: 2012-10-21 09:00:07 作者: rapoo

关于内存释放的问题
#include<stdio.h>
#include<malloc.h>
int main()
{
int* p;
p=(int*)malloc(2*sizeof(int));
*p=6;
printf("现在的空间存的数据时%d\n",*p);
printf("p指向的地址是%d\n",p);
free(p);//只能释放p所指向的空间 p本身的空间由系统释放
printf("输出的值为%d\n",*p);//由于释放p所指向的空间后 导致在原来p指向的空间里的值丢失 出现乱码
printf("p的地址%d\n",&p);//&p表示p本身的地址
*p=8;
printf("现在p所指向的值是%d\n",*p);

return 0;
}
为什么p所指向的内存被free()函数释放后还是可以直接用*p=8 而且还能编译成功 运行结果也是*p==8而
#include<stdio.h>
int main()
{
int* p;
*p=5;
printf("%d",*p);

return 0;
}/*执行结果:
由于p是一个未经初始化的指针,里面保存着一个系统不知道的地址
当把一个数放到一个连系统自己都不知道的地址中储存,则在程序执行过程中一定会因系统找不到地址而发生错误*/
这个程序却会发生错误
上一个程序中p所指向的空间被释放后不就相当于p没有被初始化了么 为什么还可以直接*p=8这样赋值而又能正确运行呢
求大神解释下

[解决办法]
上面的那个虽然p指向的存储空间被free()掉了,不过free()对应的操作可能只是将存储空间重归空闲链,但却改变不了p的值,所以这个时候你仍然能够访问它指向的存储空间.
编译器并不能检测的程序逻辑错误.
[解决办法]
free()是不是清除了释放的存储空间,取决于其实现,不过一般都会填成一个特殊的值.
如果你继续使用p指针访问指向的存储空间,在后面如果又有一次的malloc动作如:

C/C++ code
char *q = malloc(); 

读书人网 >C语言

热点推荐