首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于内存释放的有关问题

2012-10-21 
关于内存释放的问题#includestdio.h#includemalloc.hint main(){int* pp(int*)malloc(2*sizeof(int)

关于内存释放的问题
#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(); 

热点排行