重写strcpy,输出为什么是asd?代码如下

qq5823996 2011-03-02 08:45:11
char* strcpy_(char* strDest,const char* strSrc)
{
if (strDest==NULL || strSrc == NULL)
{
return 0;
}
char *strDestCopy = strDest;
while ((*strDest++ = *strSrc++) != '\0')
{
;
}
cout<<strSrc<<endl;
return strDestCopy;
}

int main()
{
char a[10]="adf";
strcpy_(a,"123");
return 0;
}
...全文
339 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq5823996 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 yylwuwei 的回复:]
这个比较有趣,我仔细分析了这个问题:详情参见:(我写了3个小时,这篇文章)

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

还是先说些观点:

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

Debug版本中,整个程序需要使用的……
[/Quote]
非常感谢,我先下班,回家看!
yylwuwei 2011-03-06
  • 打赏
  • 举报
回复
这个比较有趣,我仔细分析了这个问题:详情参见:(我写了3个小时,这篇文章)

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

还是先说些观点:

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

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

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

using namespace std;

int main()
{
char a[10]="adf";
char *str="123";
str+=4;
cout << str;
return 0;
}

效果一样,你不必纠结什么strcpy了。。
qq5823996 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhao4zhong1 的回复:]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
[/Quote]

我用汇编看了,0x00337830是strSrc的地址,后面跟着123.adf,为什么后面会跟着adf呢?
0x00337830 31 32 33 00 61 64 66 00 66 00 3a 00 5c 00 64 00 64 00 5c 00 76 00 63 123.adf.f.:.\.d.d.\.v.c
aaasongshu 2011-03-04
  • 打赏
  • 举报
回复
//很简短,调试通过
#include <stdio.h>
void strcpy_(char *to, const char *from)
{
for (; (*to = *from) != '\0'; ++from, ++to);
}

void main()
{
char a[10]="adf";
strcpy_(a,"123");
printf("%s\n",a);
}
ConquerHappy 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 passerbythesun 的回复:]

C/C++ code
#include <iostream>

using namespace std;

int main()
{
char a[10]="adf";
char *str="123";
str+=4;
cout << str;
return 0;
}

效果一样,你不必纠结什么strcpy了。。
[/Quote]
+1,passerbythesun的两个解释是可能的。
fulima007 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 delphiwcdj 的回复:]
引用 3 楼 delphiwcdj 的回复:

对的啊
cout<<strSrc<<endl;// adf
cout<<strDestCopy<<endl// 123
return strDestCopy;

很奇怪,VS2008编译上面代码,将strSrc又重置了,还是输出adf。
[/Quote]
我测试过也是这样的, +1
LinuxBirdMan 2011-03-03
  • 打赏
  • 举报
回复
cout<<strSrc<<endl//你输出的变量不对。。而且输出后的值是随机的
passerbythesun 2011-03-03
  • 打赏
  • 举报
回复
我好像懂了~

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

因为复制完 1 2 3 '\0' 之后,strSrc就指向adf了,"adf"和"123"都是字符串常量存在程序的 静态区

如果分别给字符数组复制就不会出现这个情况了
char a[10];
a[0]='a';
a[1]='d';
a[2]='f';
a[3]='\0';


可以debug验证下嘛,至于为什么是这个顺序就不知道了?
qq5823996 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 delphiwcdj 的回复:]
引用 11 楼 qq5823996 的回复:

引用 8 楼 kos_close 的回复:
指针输错了
cout << strDestCopy << endl; 能让你看到希望的结果


这段代码的结果我不在意,我就是不明白
while ((*strDest++ = *strSrc++) != '\0')之后
strSrc的值就变为adf了。。。求教!!

用release版……
[/Quote]

debug和release是一样的吧。。。
delphiwcdj 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qq5823996 的回复:]

引用 8 楼 kos_close 的回复:
指针输错了
cout << strDestCopy << endl; 能让你看到希望的结果


这段代码的结果我不在意,我就是不明白
while ((*strDest++ = *strSrc++) != '\0')之后
strSrc的值就变为adf了。。。求教!!
[/Quote]
用release版本编译下
赵4老师 2011-03-03
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
qq5823996 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kos_close 的回复:]
指针输错了
cout << strDestCopy << endl; 能让你看到希望的结果
[/Quote]

这段代码的结果我不在意,我就是不明白
while ((*strDest++ = *strSrc++) != '\0')之后
strSrc的值就变为adf了。。。求教!!
qq5823996 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 delphiwcdj 的回复:]
对的啊
cout<<strSrc<<endl;// adf
cout<<strDestCopy<<endl// 123
return strDestCopy;
[/Quote]

在函数里面strSrc的值是传进来的,是123,为啥++后就是adf了呢???
qq5823996 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ww884203 的回复:]
因为strSrc已经被++了,不是原来的123了。
至于asd怎么来的就是你的内存里面的东西了
[/Quote]

*strSrc++ 为什么就不是123了呢?标题我写错了,我想问为什么输出的是adf,求教!!
★南部之星★ 2011-03-02
  • 打赏
  • 举报
回复
指针输错了
cout << strDestCopy << endl; 能让你看到希望的结果
nanchangniat 2011-03-02
  • 打赏
  • 举报
回复

#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;
return strDestCopy;
}

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

cout<<"数组修改为:";
for(int i = 0; i < 10; i ++)
{
cout<<a[i];
}
cout<<endl;

system("pause");
return 0;
}

输出结果
数组修改为:123
delphiwcdj 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 delphiwcdj 的回复:]

对的啊
cout<<strSrc<<endl;// adf
cout<<strDestCopy<<endl// 123
return strDestCopy;
[/Quote]
很奇怪,VS2008编译上面代码,将strSrc又重置了,还是输出adf。
飞翔的薄荷 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ww884203 的回复:]
因为strSrc已经被++了,不是原来的123了。
至于asd怎么来的就是你的内存里面的东西了
[/Quote]

+1
delphiwcdj 2011-03-02
  • 打赏
  • 举报
回复
再贴一个

char *
strcpy(char *to, const char *from)
{
char *save = to;

for (; (*to = *from) != '\0'; ++from, ++to);
return(save);
}

加载更多回复(3)

64,654

社区成员

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

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