以下是引用lahalaha90在2014-11-30 15:32:49的发言:
下面我的程序 但是结果是这样的
#include <stdio.h>
int main()
{
char x[11],y[11];
printf("Enter string 1: ");
scanf("%s",x);
printf("Enter string 2: ");
scanf("%s",y);
printf("x=%s\n",x);
printf("y=%s\n",y);
return 0;
}
这应该和编译器有关,你这样的情况和VC6.0是一样的。如果你会调试的话,你会发现程序给x,y分配内存时,分配顺序是从低到高依次给y和x分配。假设给y分配的是0x00000010 - 0x0000001A这十一个字节,那么给x的空间为0x0000001B - 0x00000025。分配完空间后,给x空间填入字符,由于你输入了11个字符,系统会在字符最后自动添加一个'\n',所以在地址0x00000026处是一个'\n',当然这已经溢出了。同理,给y填入字符的时候也会有溢出,而溢出导致的结果就是本来属于x的空间的第一个字节被改写成了'\n',这就是为什么输出x的时候是空白的原因。这是一个很有趣的溢出BUG,如果你把两个scanf语句调换一个顺序或者把x,y在声明语句中的书写顺序交换一下,结果会是什么呢?不调试的话,你能写出来吗?
[
本帖最后由 yahwei 于 2014-12-1 12:47 编辑 ]