再运行,输入abcde。我运行的结果是,在VC++6.0中,输出abcde,并弹出了我们熟悉的内存越界错误提示。在codeBlocks下,输出abcde,什么也没提示。
请读者想想,这是一个多么凶险的Bug。
下面再给出一个程序:
[cpp]?
#include ???
using namespace std;?
int main()??
{??
??? char a[4],b[4];?
??? cin>>a;?
??? cin>>b;?
??? cout< ??? cout< ??? return 0;??
}?
#include
using namespace std;
int main()
{
?char a[4],b[4];
?cin>>a;
?cin>>b;
?cout< ?cout< ?return 0;
} 运行的任务交给读者了,观察输入3个字符、4个字符、5个字符的情形,也可以在多个平台上试试,针对结果想想为什么。用单步执行的手段跟踪一下内存中的数据存储,是个强烈建议的办法。
下面是为a和b数组输入3个字符后(分别是abc和hij),利用单步执行看到的结果:

?
下面是为a和b数组输入5个字符后(分别是abcef和hijkl),利用单步执行看到的结果:

从中看出,VC++6.0中,先定义的a数组的地址大于后定义的数组b的地址,本来为a中输入了abcde,侵占了别人的地盘,随后为b输入hijkl,侵占的就是a的地盘,b[4]即a[0]为l,b[5]即a[1],存储的是'\0'!
下图是在codeBlocks下,用同样的输入调试截出的结果,结果一样:

接下来,再给一个程序,其实就是将输入a和b的顺序换了一下:
[cpp]?
#include ???
using namespace std;?
int main()??
{??
??? char a[4],b[4];?
??? cin>>b;?
??? cin>>a;?
??? cout< ??? cout< ??? return 0;??
}?
#include
using namespace std;
int main()
{
?char a[4],b[4];
?cin>>b;
?cin>>a;
?cout< ?cout< ?return 0;
} 运行结果会是怎样?读者你自己说吧。不要忘了,用调试工具这个法宝解除你的疑惑。
?