内存free 后还可strcpy??

tianma1632 2007-10-29 08:26:12
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>

void main()
{

char *str= (char *) malloc(100);

strcpy(str, "hello");
free(str);

if(str != NULL){
strcpy(str, "world");
printf(str);
}

}

打印结果:world
str地址处的内存不是已经被free了吗?为什么还可以存放world ????
...全文
212 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttlyfast 2007-10-30
  • 打赏
  • 举报
回复
看看这个你就完全明白了
http://blog.csdn.net/ttlyfast/archive/2007/10/10/1818034.aspx
cnvb 2007-10-29
  • 打赏
  • 举报
回复
free之后再赋个null的确是个好习惯。学习...
zichuanxiu 2007-10-29
  • 打赏
  • 举报
回复
传说中的野指针
thecorr 2007-10-29
  • 打赏
  • 举报
回复
准备读一下。。。

Treazy 2007-10-29
  • 打赏
  • 举报
回复
free释放malloc的申请内存
释放完后ptr指向未知区域
再对ptr进行strcpy
就相当于没系保险在开车,不出事故算是运气,出了事故就是一命呜呼

这就是所谓的野指针,c语言中经常出现的问题,值得引起注意
问题造成的结果是“轻则扣奖金,重则被鄙视”!
更有甚者数据完全改写,而找不到问题所在!
羽中漫步 2007-10-29
  • 打赏
  • 举报
回复
养成好habit
free完置空
“轻则扣奖金,重则被鄙视”了。。。
是啊,对极了,林锐那本书很精典!
CedarDiao 2007-10-29
  • 打赏
  • 举报
回复
哈哈,强烈建议看看林锐博士的那篇《高质量C++/C程序设计指南》
然后你就会明白什么叫野指针,然后你会明白为什么这样写会被“轻则扣奖金,重则被鄙视”了。。。
飞哥 2007-10-29
  • 打赏
  • 举报
回复
完全没有意义的代码

打印啥不重要,重要的是不能那么写

养成好habit
free完置空
独孤过儿 2007-10-29
  • 打赏
  • 举报
回复
在我的编译器上可以,MinGW Studio 2.05,测试代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char* ptr = (char*)malloc(sizeof(char)*10);
strcpy(ptr, "hello");
printf("%s\n", ptr);
free(ptr);

strcpy(ptr, "world");
printf("%s\n", ptr);

return 0;
}

但是写这样的代码,轻则扣奖金,重则被鄙视啊,呵呵
zhangyanli 2007-10-29
  • 打赏
  • 举报
回复
我的运行结果第一次就崩溃了.因为释放后str并不指向空,if(str != NULL)为真.
就是野指针.你的程序不崩溃是偶然情况.

一般释放后都这样保证安全:str=NULL;
mx81831 2007-10-29
  • 打赏
  • 举报
回复
不可以。
free后指针指向空。
youyifang 2007-10-29
  • 打赏
  • 举报
回复
free以后并没有把指针指向空,只是清除了str的内存地址地内容,而且指针成为了野指针,但是在执行strcpy地时候,也是把“word”地地址给了str,所以,可以打印出来。
  • 打赏
  • 举报
回复
不可以,你要承担不可预料的结果

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧