arrays - 超出缓冲区末尾的读取如何在 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]
呢?
解决方案
超出缓冲区末尾的读取如何在 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 章
如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的其余部分应隐式初始化与具有静态存储持续时间的对象相同。
推荐阅读
- c# - 使用 RestSharp 和 Xamarin 上传文件
- asp.net-mvc - 如何使用 ASP.Net MVC 4.5 创建多登录用户
- r - 使用 dplyr 时,我应该在哪一步将数据发送到 data.table() 以获得最佳性能?
- angular - 使用 Angular 6 的异步 API 请求
- google-api - Google Search Console - 获取属性集名称
- c# - 在 line player.PlaySync() 中出现错误
- javascript - Node.js 在不打印换行符的情况下获取用户输入
- javascript - 目标完成和事件总数之间的差异 - 服务器端跟踪 Google Analytics
- python - 使用另一个类中的函数调用一个类中的函数
- asp.net - 从命令行更新 Css/Js 包(Visual Studio Bundler Minifier)