首页 > 解决方案 > 超出缓冲区末尾的读取如何在 C 中工作?

问题描述

创建这个x.c测试文件:

int main(void)
{
  char x[2] = {3};
  return x[2];
}

然后运行

gcc x.c; ./a.out; echo $?

结果是:64

为什么64

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

return x[1];

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

标签: arrayscinitialization

解决方案


超出缓冲区末尾的读取如何在 C 中工作?为什么是 64?

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

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

也就是说,像这样的声明

 char x[2] = {3};

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

引用C11,第 6.7.9/P21 章

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


推荐阅读