vs2008下一个问题

delphiwcdj 2011-03-02 10:05:49
原帖
很奇怪,VS2008编译上面代码,将strSrc又重置了,还是输出adf


#include <iostream>
using namespace std;
char* strcpy_(char* strDest,const char* strSrc)
{
if (strDest==NULL || strSrc == NULL)
{
return 0;
}
char *strDestCopy = strDest;
while ((*strDest++ = *strSrc++) != '\0')
{
;
}
cout<<strSrc<<endl;// adf
cout<<strDestCopy<<endl;// 123
return strDestCopy;
}

int main()
{
char a[10]="adf";
strcpy_(a,"123");
return 0;
}

...全文
265 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
碎碎念 2011-03-06
  • 打赏
  • 举报
回复
我也很奇怪...
为什么strSrc指向了这样一块内存"123\0adf"
是不是常量存储区的"123"和"adf"恰好是这样挨着的...
yylwuwei 2011-03-06
  • 打赏
  • 举报
回复
这个比较有趣,我仔细分析了这个问题:详情参见:(我写了3个小时,这篇文章)

http://blog.csdn.net/yylwuwei/archive/2011/03/06/6226460.aspx

还是先说些观点:

这个问题出现的本质原因在于编译器对堆和栈的使用策略,以及VS开发环境对Debug版本和Release版本的处理方式不同。

Debug版本中,整个程序需要使用的常量字符串都被依次定义在堆中了,于是就出现了这个奇怪的现象。

Release版本运行结果不一样,是因为这个版本并未将所有的常量字符串都依次定义在堆中,如本例中看到的,从CPU寄存器直接拷贝到栈中,而不是先在堆中定义这个字符串,再拷贝到栈中。
hslinux 2011-03-03
  • 打赏
  • 举报
回复
cout<<strSrc<<endl;

这个结果是不可以预知的。
譬如开始strSrc地址值为0x00000001
cout之时,strSrc地址值为0x00000005
那么cout就输出0x00000005这个地址开始,到'\0'结束的字符串值。
delphiwcdj 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]

请用release模式编译下
[/Quote]
请问debug下为什么会这样呢
pengzhixi 2011-03-02
  • 打赏
  • 举报
回复
请用release模式编译下

65,184

社区成员

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

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