这是C++的一个内情吗?解决方案
这是C++的一个内情吗?
#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++的内情,还是我某地方想歪了?望指点!
------解决方案--------------------
#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++的内情,还是我某地方想歪了?望指点!
------解决方案--------------------
- C/C++ code
strcpy//这个函数本身就是一个不安全的函数 利用strncpy函数吧。
------解决方案--------------------
想歪了
多一个都不行
------解决方案--------------------
------解决方案--------------------
我想应该是这样:
str大小只有21个字节,你strcpy后不管有没有崩溃,都已经数组越界,踩内存了。本来就是错误。你可以用打印一下sizeof看看。
实际内存分配临时变量是存在栈的,进入main,栈顶为21个字节的str,实际应该上面还空3个字节,共24个字节。调用strcpy时,两个参数同样入栈,所以此时str上面的几个字节被用了,且多半存储的是地址。src比dst长的话,如果再那24个字节内,踩一下没问题,如果超过24个字节,要看情况了,比如字符串末尾是0,而恰巧栈这个地址的这个字节也是0的话应该没问题。
试一下如果改为
char str[]="1234567890123456789012";//共21个字符
就不是扩4个字节了。
------解决方案--------------------
别指望用这些方法去测试什么“内幕”了,这样的做法就是在玩火。
哪怕多出一个字节,你也会破坏栈。但由于具体程序的不同,被破坏的栈并不一定会有严重后果出现。仅此而已
这样的写法或者能容忍破坏掉4个字节,另一种写法或者就可以容忍破坏8个字节,再下一种写法或者还能容忍更多。但,你要是想把它用到工作中,会怎么死就很明确了:被砸了饭碗活活饿死。
如此“内幕”,你真想要?