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

关于free()跟malloc

2012-09-21 
关于free()和malloc#includestdio.h#includestdlib.h#includestring.hvoid main(){char *sr(char*)

关于free()和malloc
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main(){
char *sr=(char*)malloc(100);
strcpy(sr,"hell0");
printf("%S",sr);
free(sr);
if(sr!=NULL)
strcpy(sr,"world");
printf("%s",sr);

}
结果只是WORLD
请问一下这是为什么?


[解决办法]
free(sr)只是把sr指向的内存空间标识为可用,并且内存中的数据不会被清空,就像我们删除硬盘上的文件一样,删除操作只是把文件所占用的块标识为可用,并不会对内容进行清空,因此,文件才能恢复。
回到正题,free(sr)后,sr此时仍然指向那块内存,且内容不变,因此你再strcpy操作sr指向的内存空间在操作上是合法的(因为仍然属于其进程内),只是,在逻辑上是错误的,非法的,危险的,因为此时,那块内存可能已经被重新分配给了其他指针,而你通过strcpy擅自修改了其内容。
释放内存严格的写法应该是:
free(sr);
sr = NULL;
[解决办法]

探讨
free(sr)只是把sr指向的内存空间标识为可用,并且内存中的数据不会被清空,就像我们删除硬盘上的文件一样,删除操作只是把文件所占用的块标识为可用,并不会对内容进行清空,因此,文件才能恢复。
回到正题,free(sr)后,sr此时仍然指向那块内存,且内容不变,因此你再strcpy操作sr指向的内存空间在操作上是合法的(因为仍然属于其进程内),只是,在逻辑上是错误的,非法的,危险的,因为此时,那……

[解决办法]
探讨
free(sr)只是把sr指向的内存空间标识为可用,并且内存中的数据不会被清空,就像我们删除硬盘上的文件一样,删除操作只是把文件所占用的块标识为可用,并不会对内容进行清空,因此,文件才能恢复。
回到正题,free(sr)后,sr此时仍然指向那块内存,且内容不变,因此你再strcpy操作sr指向的内存空间在操作上是合法的(因为仍然属于其进程内),只是,在逻辑上是错误的,非法的,危险的,因为此时,那……

[解决办法]
探讨
free(sr)只是把sr指向的内存空间标识为可用,并且内存中的数据不会被清空,就像我们删除硬盘上的文件一样,删除操作只是把文件所占用的块标识为可用,并不会对内容进行清空,因此,文件才能恢复。
回到正题,free(sr)后,sr此时仍然指向那块内存,且内容不变,因此你再strcpy操作sr指向的内存空间在操作上是合法的(因为仍然属于其进程内),只是,在逻辑上是错误的,非法的,危险的,因为此时,那……

热点排行