下面程序的输出结果~~为什么???

hongxia1981 2009-08-28 11:06:57
char s[] = "123456789";
char d[] = "123";
strcpy(d,s);
printf("%s,\n%s\n",d,s);
...全文
186 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
niimp2 2009-08-28
  • 打赏
  • 举报
回复
不可以想當然啊,向5樓學習
shengang1978 2009-08-28
  • 打赏
  • 举报
回复
crash。
内存越界啦。
rejoice914 2009-08-28
  • 打赏
  • 举报
回复
边一起好像把
char a[];
char b[];
放在一起!
使用strcpy要记住des一定要比src长
liao05050075 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 supermegaboy 的回复:]
s未必在d之前,这是不确定的,而且,s和d之间也有可能含有其它东西。
[/Quote]
一般的,s是在d之前,因为它们使用的是栈空间。并且s,d是连续定义的,因为是char型的,不会考虑内存对齐,所以一般也会连在一起。
至少我见过的编译器,VC6和DEV-c++都是这么干的。难道这是一个编译器相关问题?
cppresearcher 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 supermegaboy 的回复:]
s未必在d之前,这是不确定的,而且,s和d之间也有可能含有其它东西。
[/Quote]

  • 打赏
  • 举报
回复
vs2005验证,
123456789,
123456789
coverallwangp 2009-08-28
  • 打赏
  • 举报
回复

int main()
{
char s[] = "123456789";
char d[] = "123";
strcpy(d,s);
printf("%s,\n%s\n",d,s);

return 0;
}


如果你的程序是上面这样的话,那么运行结果是:
123456789,
56789

查看汇编代码可以看到

7: char s[] = "123456789";
00401048 mov eax,[string "123456789" (0042f02c)]
0040104D mov dword ptr [ebp-0Ch],eax
00401050 mov ecx,dword ptr [string "123456789"+4 (0042f030)]
00401056 mov dword ptr [ebp-8],ecx
00401059 mov dx,word ptr [string "123456789"+8 (0042f034)]
00401060 mov word ptr [ebp-4],dx
8: char d[] = "123";
00401064 mov eax,[string "123" (0042f028)]
00401069 mov dword ptr [ebp-10h],eax
9: strcpy(d,s);
0040106C lea ecx,[ebp-0Ch]
0040106F push ecx
00401070 lea edx,[ebp-10h]
00401073 push edx
00401074 call strcpy (00408220)
00401079 add esp,8


d的在栈的地址是ptr [ebp-10h],s是ptr [ebp-0Ch],
所以当用strcpy的时候,d溢出把s的前几位覆盖成了"56789\0",所以s输出的时候遇到'\0'就结束了,所以输出"56789"
飞天御剑流 2009-08-28
  • 打赏
  • 举报
回复
s未必在d之前,这是不确定的,而且,s和d之间也有可能含有其它东西。
liao05050075 2009-08-28
  • 打赏
  • 举报
回复
结果应该是:
123456789,
56789

char s[] = "123456789";
char d[] = "123";
strcpy(d,s);

你将s拷贝到d,而d的空间不够,于是就会覆盖d[3]之后的内容。
由于在内存分布中,d是在s前面的,d的长度为4(加上一个'\0'),所以s就是在d+4的位置那里。
于是原来从d开始的内存是这样的123'\0'123456789'\0'
strcpy后,就变成123456789'\0'789,s[0]是5。
kakashi0309 2009-08-28
  • 打赏
  • 举报
回复
123456789,
56789

strcpy(d, s) 执行过以后 s指针位置偏移到5这里
sytstarac 2009-08-28
  • 打赏
  • 举报
回复
如果可以运行就是:
123456789
123456789
老A四十二号 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 hongxia1981 的回复:]
char s[] = "123456789";
char d[] = "123";
strcpy(d,s);
printf("%s,\n%s\n",d,s);
[/Quote]

strcpy (*des, *src)函数你自己要保证des的空间足够大,否则会越界导致程序崩溃。
你这种写法本身就是一个潜在的BUG,建议你不要这样写。
taodm 2009-08-28
  • 打赏
  • 举报
回复
4楼已答。不要多浪费精力了。
xiao_yanjing 2009-08-28
  • 打赏
  • 举报
回复
3楼的算详细吧。
编程-鸟人-_-- 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 iloveprogrammingdeep 的回复:]
vs2005验证,
123456789,
123456789
[/Quote]

vs2005确实是这样显示,但是报错!
“Run-Time Check Failure #2 - Stack around the variable 'd' was corrupted.”

char *strcpy( char *strDestination, const char *strSource );

strcpy(d,s);//s的值是不能修改的!

64,654

社区成员

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

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