这是C++的一个内情吗?

深圳大哥 2012-04-12 07:28:35
#include <iostream>
using namespace std;

int main()
{
char str[]="12345678901234567890";//共21个字符

strcpy(str, "123456789012345678901234");//共25个字符

printf(str);

return 0;

}
运行结果:
123456789012345678901234

如果将程序改为

#include <iostream>
using namespace std;

int main()
{
char str[]="12345678901234567890";//共21个字符

strcpy(str, "1234567890123456789012345");//共26个字符

printf(str);

return 0;

}
运行结果:

虽然结果输出了1234567890123456789012345 但程序马上接着就崩溃了

我在在VC++6.0中测试的,strcpy(char *strDest,const char *strSrc)为什么strSrc比strDest多少于四个字符不会崩溃,而超过四个了就崩溃了,当然我测试了多组数据,临界均是4个,在我本来的想法中,strDest应该大于等于strSrc的长度,如果不大于就会崩溃,但实践证明竟然有四个字符的差距,我开始以为是C++要一次分配的内存是4或8字符的倍数,但实践证明不是,而是只差四个字符
请问各位有什么想法,是我所不知道C++的内情,还是我某地方想歪了?望指点!
...全文
185 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
深圳大哥 2012-04-12
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int main()
{
char str[]="12345678901234567890";//共21个字符

strcpy(str, "123456789012345678901234");//共25个字符

printf(str);

cout<<endl<<sizeof(str)<<endl;

return 0;

}
运行结果:
123456789012345678901234
21

sizeof(str)=21,果然不是什么内情,只是一个未知情况,同时也是一种玩火哈
muyi66 2012-04-12
  • 打赏
  • 举报
回复
别指望用这些方法去测试什么“内幕”了,这样的做法就是在玩火。

哪怕多出一个字节,你也会破坏栈。但由于具体程序的不同,被破坏的栈并不一定会有严重后果出现。仅此而已

这样的写法或者能容忍破坏掉4个字节,另一种写法或者就可以容忍破坏8个字节,再下一种写法或者还能容忍更多。但,你要是想把它用到工作中,会怎么死就很明确了:被砸了饭碗活活饿死。

如此“内幕”,你真想要?
ceofit 2012-04-12
  • 打赏
  • 举报
回复
我想应该是这样:

str大小只有21个字节,你strcpy后不管有没有崩溃,都已经数组越界,踩内存了。本来就是错误。你可以用打印一下sizeof看看。
实际内存分配临时变量是存在栈的,进入main,栈顶为21个字节的str,实际应该上面还空3个字节,共24个字节。调用strcpy时,两个参数同样入栈,所以此时str上面的几个字节被用了,且多半存储的是地址。src比dst长的话,如果再那24个字节内,踩一下没问题,如果超过24个字节,要看情况了,比如字符串末尾是0,而恰巧栈这个地址的这个字节也是0的话应该没问题。

试一下如果改为
char str[]="1234567890123456789012";//共21个字符
就不是扩4个字节了。
x363635334 2012-04-12
  • 打赏
  • 举报
回复
要证明就得先找到strcpy的真正源码
evencoming 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

想歪了
多一个都不行



我想是一个也不行哈。
但实践证明怎么可以多出四个哈
[/Quote]
典型的未定义问题.
不出问题只是运气,出什么问题都是正常的
深圳大哥 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

想歪了
多一个都不行
[/Quote]


我想是一个也不行哈。
但实践证明怎么可以多出四个哈
ma100 2012-04-12
  • 打赏
  • 举报
回复
想歪了
多一个都不行
漫步者、 2012-04-12
  • 打赏
  • 举报
回复

strcpy//这个函数本身就是一个不安全的函数
利用strncpy函数吧。

64,637

社区成员

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

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