c - C初始化的全局结构与未初始化的成员整数定义了beheviour?
问题描述
根据定义的行为,未初始化的全局 int 始终为 0,如果它不是全局的,则不正确。全局结构呢?做
struct s
{
int a;
}instance;
int main()
{
printf("%d\n", instance.a);
return 0;
}
总是打印0
还是技术上未定义的行为?
解决方案
对于全局结构,所有字段都将初始化为 0 / NULL。这在当前C 标准的第 6.7.9p10 节中有详细说明:
如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态或线程存储持续时间的对象未显式初始化,则:
- 如果是指针类型,则初始化为空指针;
- 如果它具有算术类型,则将其初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则(递归)初始化每个成员,并将任何填充初始化为零位;
- 如果是联合,则根据这些规则(递归)初始化第一个命名成员,并将任何填充初始化为零位;
旧的C89 标准在第 3.5.7 节中有类似的语言:
具有静态存储持续时间的对象未显式初始化,它被隐式初始化,就好像每个具有算术类型的成员都被分配了 0 并且每个具有指针类型的成员都被分配了一个空指针常量。如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的
...
如果聚合包含聚合或联合的成员,或者联合的第一个成员是聚合或联合,则规则递归地应用于子聚合或包含的联合
所以在你的情况下,instance.a
保证设置为0。
推荐阅读
- arrays - 红宝石计数笑脸 - 退出代码 = 1
- nuxt.js - 如何将中间件添加到 Nuxt 中的一组路由
- node.js - 黑名单 JWT 令牌
- python - 如何打印动态分配函数的方法名称?
- utf-8 - 从 bash 中的大文本文件中删除 latin-1 字符
- javascript - 按年龄对数组进行排序
- excel - 使用 Apache poi 在 Selenium 中处理 excel 的问题
- python - 如何在 scrapy 中使用选择器解析这个特定的 html 正文?
- javascript - 将多个复选框值存储在一个 localStorage 键中
- c# - 控件上的透明图像