返回信息流void GetMemory(char **p,int num)
{
*p=(char *)malloc(num);
}
int main()
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello");
free(str);
if(str!=NULL)
{
strcpy(str,"world");
}
printf("\n str is %s",str);
return 0;
}
输出为啥是world
这是一条镜像帖。来源:北邮人论坛 / cpp / #77867同步于 2014/3/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
一道关于malloc与free的问题
enjoyde
2014/3/28镜像同步21 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
输出为啥不是world?
strcpy(str,"world");
这句不是已经改成world了吗?不要指望free为你做太多。。。
通常不是这样写代码的吗:
if (str) {
free(str);
str = NULL;
}
恩,就想了解下free完后,似乎那段申请的内存还能被用,没有被操作系统回收,那free有什么作用
【 在 zx723 的大作中提到: 】
: 输出为啥不是world?
: [code=c]
: strcpy(str,"world");
: ...................
【 在 enjoyde 的大作中提到: 】
: 恩,就想了解下free完后,似乎那段申请的内存还能被用,没有被操作系统回收,那free有什么作用
其实应该已经回收了,操作系统只是把这段内存标记回free的状态,如果程序又要malloc,就可能从这分配。
你可以在free之后,不断的calloc(清空),直到没有空间给你,你再访问str, 就不会输出world了。
当然看看ls大神们是怎么说的呢?
free之后 数据等着被覆盖
【 在 enjoyde (不知不觉||后知后觉) 的大作中提到: 】
: void GetMemory(char **p,int num)
: {
: *p=(char *)malloc(num);
: ...................
free()之后str存储的值还没变啊,还是指向那块内存啊,所以 (str!=NULL)是成立的啊。但是strcpy由于str并没有分配内存了,所以应该出错吧,我在机器上跑的结果是出错,堆损坏什么的...