#include <stdio.h>
#include <stdlib.h>
int test(void)
{
int a=0,b=0;
char buf[4];
gets(buf);
printf("a:%d b:%d",a,b);
}
int main()
{
test();
return 0;
}
问题是为什么输入:aaaaa a 变成 97 而不是 b?从当 buf 溢出时在 test 中声明变量的方式来看,它不应该先影响 b 然后影响 a 吗?
#include <stdio.h>
#include <stdlib.h>
int test(void)
{
int a=0,b=0;
char buf[4];
gets(buf);
printf("a:%d b:%d",a,b);
}
int main()
{
test();
return 0;
}
问题是为什么输入:aaaaa a 变成 97 而不是 b?从当 buf 溢出时在 test 中声明变量的方式来看,它不应该先影响 b 然后影响 a 吗?
a
并且b
变量不一定与变量连续buf
。因此,变量 , 的溢出与和buf
的可能值无关。行为将是未定义的。a
b
但是,重要的是要提到C标准会将所有数组(例如 buf)存储在连续的内存位置中。
在这里您可以查看文档:
数组是一系列相同类型的元素,它们放置在连续的内存位置,可以通过将索引添加到唯一标识符来单独引用这些元素。
未定义的行为是未定义的。语言标准中没有关于函数中不同变量的相对位置的任何内容,并且绝对不能保证在缓冲区溢出情况下会发生什么。