读书人

关于free()跟malloc

发布时间: 2012-09-21 15:47:26 作者: rapoo

关于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指向的内存空间在操作上是合法的(因为仍然属于其进程内),只是,在逻辑上是错误的,非法的,危险的,因为此时,那……

读书人网 >C语言

热点推荐