Arrays 在C语言中,超出缓冲区末尾的读取是如何工作的?
创建此x.c测试文件:Arrays 在C语言中,超出缓冲区末尾的读取是如何工作的?,arrays,c,initialization,Arrays,C,Initialization,创建此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] 在C语言中,超出缓冲区末尾的读取是如何工作的?为什么是64岁 它不起作用,这是一个错误的结果。x[2]处不存在数组元素 我们得到0?为什么{3}也没有初始化x[1] 也就是说,
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]
在C语言中,超出缓冲区末尾的读取是如何工作的?为什么是64岁
它不起作用,这是一个错误的结果。x[2]处不存在数组元素
我们得到0?为什么{3}也没有初始化x[1]
也就是说,像这样的声明
char x[2] = {3};
创建一个包含两个元素的数组x,由x[0]和x[1]访问,并根据初始化规则将x[0]初始化为3,将任何剩余元素初始化为0,其中初始化器元素的数量少于数组元素。因此,{3}不会将所有数组元素初始化为值3,而是只设置第一个元素的值
引用C11,第6.7.9/P21章
如果大括号内的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文本中的字符少于数组中的元素,聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同
在C语言中,超出缓冲区末尾的读取是如何工作的?为什么是64岁
它不起作用,这是一个错误的结果。x[2]处不存在数组元素
我们得到0?为什么{3}也没有初始化x[1]
也就是说,像这样的声明
char x[2] = {3};
创建一个包含两个元素的数组x,由x[0]和x[1]访问,并根据初始化规则将x[0]初始化为3,将任何剩余元素初始化为0,其中初始化器元素的数量少于数组元素。因此,{3}不会将所有数组元素初始化为值3,而是只设置第一个元素的值
引用C11,第6.7.9/P21章
如果大括号内的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文本中的字符少于数组中的元素,聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同
我能想到的唯一可能的原因是因为你的完美答案,我现在没有机会因为再做一个而获得任何声誉。干杯。@Rubberbe现在不见了,希望我的编辑没有让事情变得更糟PNaah,现在更多了。为什么我们加x[2]=5;回报值是5?我能想到的唯一可能的原因是因为你的完美答案,我现在没有机会因为再做一个而获得任何声誉。干杯。@Rubberbe现在不见了,希望我的编辑没有让事情变得更糟PNaah,现在更多了。为什么我们加x[2]=5;返回值是5?你撬开一个属于别人的存款箱,但你没有访问权限,然后找到64美元。为什么是64美元?为什么它不是空的?为什么不是10、100、1000或一只吉娃娃?可能是因为保管箱的主人可以随意在里面存放任何东西吗?关于数组的部分初始化,请参见:@Lundin为什么我们添加x[2]=5;返回值是5?因为当你把5美元放进一个被破门而入的储蓄箱时,警察没能抓住你。你很幸运,店主没有来更改里面的东西。@Lundin在这种情况下不应该发生分割错误吗?你撬开了一个别人的存款箱,而你没有权限打开它,找到了64美元。为什么是64美元?为什么它不是空的?为什么不是10、100、1000或一只吉娃娃?可能是因为保管箱的主人可以随意在里面存放任何东西吗?关于数组的部分初始化,请参见:@Lundin为什么我们添加x[2]=5;返回值是5?因为当你把5美元放进一个被破门而入的储蓄箱时,警察没能抓住你。你很幸运,主人没有来更改内容。@Lundin在这种情况下不应该发生分割错误吗?