一个printf语句改变性能

wensheng_zh2007 2009-10-29 10:47:07
int main()
{
char *p = (char*)malloc(100);
strcpy(p,"hello");

// printf("%s\n",p);
free(p);

if(p!=NULL)
{
strcpy(p,"world");
}
printf("%s\n",p);
return 0;
}

输出结果为乱码,

int main()
{
char *p = (char*)malloc(100);
strcpy(p,"hello");

printf("%s\n",p);
free(p);

if(p!=NULL)
{
strcpy(p,"world");
}
printf("%s\n",p);
return 0;
}

输出
hello
world
就是多了一条输出语句,怎么会出现性质不同的结果呢?
以上都是在vc6.0下测试出的结果。

而原题是问
int main()
{
char *p = (char*)malloc(100);
strcpy(p,"hello");

free(p);

if(p!=NULL)
{
strcpy(p,"world");
}
printf("%s\n",p);
return 0;
}

的输出结果是什么?
...全文
329 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 kxalpah 的回复:]
学习了,从来没想过使用free后的指针
[/Quote]
不要学习这种东西……
2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 waiting4you 的回复:]
引用 1 楼 jackyjkchen 的回复:
按道理,这题应该崩溃……如果编译器合格的话(就是说TC不合格)

编译器合格就应该是这个样子,必然崩溃才有问题呢!有时写“野指针”也是有意义的,如DOS下写显示缓冲区。
[/Quote]
你不知道它指到什么东西才叫“野指针”,指向显示缓冲区的指针就算不是从程序的运行中获得的也不能算是“野指针”,那是一个有着明确定义的地址。
zpf82118 2009-10-30
  • 打赏
  • 举报
回复
使用野指针
楼主可是想找事啊?
jackyjkchen 2009-10-30
  • 打赏
  • 举报
回复
当年的waltcom c++就是专门用于游戏开发的,那个可以直接写显示缓冲
jackyjkchen 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 waiting4you 的回复:]
引用 1 楼 jackyjkchen 的回复:
按道理,这题应该崩溃……如果编译器合格的话(就是说TC不合格)

编译器合格就应该是这个样子,必然崩溃才有问题呢!有时写“野指针”也是有意义的,如DOS下写显示缓冲区。
[/Quote]
写dos缓冲区应该用汇编,C该做自己的事情
guzhijie1981 2009-10-30
  • 打赏
  • 举报
回复
我只看看;不说话
cattycat 2009-10-30
  • 打赏
  • 举报
回复
同意大家的说法,free之后不能再用了,更好的是让指针指向NULL。
kxalpah 2009-10-30
  • 打赏
  • 举报
回复
学习了,从来没想过使用free后的指针
逸学堂 2009-10-30
  • 打赏
  • 举报
回复
因为free(str);之后,str成为野指针,//应啊是不知道指针指到哪去了吧,但还是动态区域的?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
free(str),指针还是指向原来的地址,只是此处地址不再保证能被使用。
free一个指针后,再使用其地址,本身的行为就是不可预料,有的编译器崩溃,有的编译器可以正常输出。
WuXinyang 2009-10-30
  • 打赏
  • 举报
回复
我的天,真危险.

G++执行结果:
world
Segmentation fault(coredump)

VS2008:
world
赵4老师 2009-10-30
  • 打赏
  • 举报
回复
过去你家的地,现在你宣布你不要了,但之后你又在上面偷偷种点西瓜,你能指望从上面收获你的西瓜吗?谁知道别人占用了那块地正干啥或干过啥呢?
bfhtian 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mstlq 的回复:]
请楼主专注精力去研究怎么“做正确的事情”,而不是潜心纠结“对错误的分析”……
[/Quote]
呵呵
Waiting4you 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]
按道理,这题应该崩溃……如果编译器合格的话(就是说TC不合格)
[/Quote]
编译器合格就应该是这个样子,必然崩溃才有问题呢!有时写“野指针”也是有意义的,如DOS下写显示缓冲区。
o老猫钓鱼o 2009-10-30
  • 打赏
  • 举报
回复
指针都释放了,还去用,那非常之危险
lw_China 2009-10-30
  • 打赏
  • 举报
回复
不同的编译器,会出现不同结果。
按ANSI C来说,结果是未定义的。
jiangfeng999 2009-10-30
  • 打赏
  • 举报
回复
编程习惯的问题,在free一个指针后要把这个指针值置成空
free(p);
p=null;
wensheng_zh2007 2009-10-30
  • 打赏
  • 举报
回复
这个题是一个公司的笔试题,我也没想用这种方式的。
wensheng_zh2007 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 coding_hello 的回复:]
不要瞎整了。初学者先弄明白怎么做是对的吧。
至于错了以后为什么会出现这个结果,这个等到对编译器,堆栈处理等的理解足够了以后再说。

[/Quote]
理解原因你给说明白了,如果不明白就不要在这x说!
jzd8000 2009-10-30
  • 打赏
  • 举报
回复
野指针!
野男孩 2009-10-30
  • 打赏
  • 举报
回复
不要瞎整了。初学者先弄明白怎么做是对的吧。
至于错了以后为什么会出现这个结果,这个等到对编译器,堆栈处理等的理解足够了以后再说。

[Quote=引用楼主 wensheng_zh2007 的回复:]
C/C++ codeint main()
{char*p= (char*)malloc(100);
strcpy(p,"hello");// printf("%s\n",p); free(p);if(p!=NULL)
{
strcpy(p,"world");
}
printf("%s\n",p);return0;
}
输出结果为乱码,

C/C++ codeint main()
{char*p= (char*)malloc(100);
strcpy(p,"hello");

printf("%s\n",p);
free(p);if(p!=NULL)
{
strcpy(p,"world");
}
printf("%s\n",p);return0;
}
输出
hello
world
就是多了一条输出语句,怎么会出现性质不同的结果呢?
以上都是在vc6.0下测试出的结果。

而原题是问
C/C++ codeint main()
{char*p= (char*)malloc(100);
strcpy(p,"hello");

free(p);if(p!=NULL)
{
strcpy(p,"world");
}
printf("%s\n",p);return0;
}
的输出结果是什么?

[/Quote]
加载更多回复(7)

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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