strcpy的两端程序输出不同 求解

林初茵 2008-12-22 12:53:17
为什么第一个被截断 第二个程序不被截断
程序1:

#include <iostream>
#include <stdio.h>
using namespace std;
int main(void)
{
char s[]="123456789";
char d[]="123";

strcpy(d,s);
printf("%s,\n%s",d,s);
return 0;
}
输出
123456789,
56789


程序1:

#include <iostream>
#include <stdio.h>
using namespace std;
int main(void)
{
char s2[]="123456789";
char d2[]="1234";

strcpy(d2,s2);
printf("%s,\n%s",d2,s2);
return 0;
}

输出
123456789,
123456789
...全文
133 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsd1025 2008-12-23
  • 打赏
  • 举报
回复
都是错的,这种规则之外的东西没意义!
tianma2005123 2008-12-22
  • 打赏
  • 举报
回复
顶8楼的。。。
wudeshou82666 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 nullah 的回复:]
越界后 结果看人品~~~~
[/Quote]
故意写错的干啥子呢....................................
梅文海 2008-12-22
  • 打赏
  • 举报
回复
我一般喜欢这样定义字符串

char a[MAX_PATH]={0};

这样一般不会导致越界
wangask00 2008-12-22
  • 打赏
  • 举报
回复
学习了
nullah 2008-12-22
  • 打赏
  • 举报
回复
越界后 结果看人品~~~~
Aaronico 2008-12-22
  • 打赏
  • 举报
回复
都越界了。。。
lbh2001 2008-12-22
  • 打赏
  • 举报
回复

char s[]="123456789"; ---->这样声明后,编译器会算出字符串的长度并为s在栈上划分相应长度的空间
char d[]="123"; ---->所以请不要越界使用


越界使用的话,越界使用在标准中是为定义的运行结果和编译器的具体实现和运行环境有关
sagegz 2008-12-22
  • 打赏
  • 举报
回复
与编译器有关!
jixingzhong 2008-12-22
  • 打赏
  • 举报
回复
越界后内容未知,其结果取决编译器策略、运行情况等等
长尾巴的悟空 2008-12-22
  • 打赏
  • 举报
回复
越界以后,结果未知.
sallan 2008-12-22
  • 打赏
  • 举报
回复
学习了,顶一下
slowboy2008 2008-12-22
  • 打赏
  • 举报
回复
首先,通常而言,程序越界后的行为应该都是无效的。

但是,实际上如果你对语言和编译比较熟悉的话,这里的情况还是很容易解释的:
(1)编译器为每个局部变量在调用栈中分配一定空间,如第一个函数中的栈情况如下:
100: d[0]
101: d[1]
102: d[1]
103: d[3]
104: '\0'
105: s[0]
106: s[1]
...
10c: s[7]
10e: '\0'
(这里假设分配的基址是100,注意栈是从高地址开始分配)
(2)c++语言中对char []的分配一般按照4/8字节单位对齐分配。在32位计算机中,c++一般以4字节单位对齐。所以在程序1中为s分配了8字节单元,为d分配了4字节单元;而在程序2中为s分配了8字节单元,为d分配了8字节单元;所以出现第一个程序会覆盖,而第二个程序不会覆盖的情况;
(3)实际上在64位机中,上面两个程序都不会覆盖,因为是按照8字节对齐。
(4)有兴趣可以自己使用%p打印各个变量地址看看就明白了,或者用objdump和readelf读取相应的符号信息可以得到答案。
xiaoyisnail 2008-12-22
  • 打赏
  • 举报
回复
用strcpy的话要保证目标缓冲区要有足够的大小容纳源缓冲区的数据,不满足这个条件是行为未定义
你的代码就没有保证足够大小的目标缓冲区,所以结果是未定义的,没办法解释,你换个编译器就可能不是这样的结果了
lann64 2008-12-22
  • 打赏
  • 举报
回复
研究这个没什么意义。
都是越界写,都是错的。

可能某个编译器对齐方式碰巧可以没覆盖到,也可能某个编译器安排变量的顺序不一样。
可不管是什么原因都没必要化精力去研究它。需要研究的是怎么样不再写出这种错误的程序。

65,211

社区成员

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

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