在 C 中如何读取缓冲区结束以外的内容?

Igo*_*nko 1 c arrays initialization

创建此x.c测试文件:

int main(void)
{
  char x[2] = {3};
  return x[2];
}
Run Code Online (Sandbox Code Playgroud)

然后运行

gcc x.c; ./a.out; echo $?
Run Code Online (Sandbox Code Playgroud)

结果是:64

为什么64

顺便说一句,为什么如果我们使用

return x[1];
Run Code Online (Sandbox Code Playgroud)

我们得到0?为什么{3}也没有初始化x[1]

Sou*_*osh 6

在 C 中如何读取缓冲区结束以外的内容?为什么64?

它不起作用,它是未定义行为的结果。在 处不存在数组元素x[2]

我们得到0?为什么{3}也没有初始化x[1]

也就是说,像这样的声明

 char x[2] = {3};
Run Code Online (Sandbox Code Playgroud)

创建一个数组x,其中包含两个元素,由x[0]and访问x[1],并初始化x[0]为 3 并将任何剩余元素初始化为0(根据初始化规则,其中初始化元素的数量少于数组元素的数量)。因此,这{3}不会将所有数组元素初始化为 value 3,而是仅设置第一个元素的值。

引用C11,第 6.7.9/P21 章

如果花括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的其余部分应隐式初始化与具有静态存储持续时间的对象相同。