【问题标题】:C initilized global struct with uninitilized member ints defined beheviour?C用未初始化的成员整数定义的行为初始化全局结构?
【发布时间】:2018-07-25 11:52:13
【问题描述】:

根据定义的行为,未初始化的全局 int 始终为 0,如果它不是全局的,则不是这样。全局结构呢? 有没有

struct s
{
    int a;
}instance;

int main()
{    
    printf("%d\n", instance.a);
    return 0;
}

总是打印0 还是技术上未定义的行为?

【问题讨论】:

  • 全局(和静态)变量初始化为0,是的。可能有重复。
  • 是的。请下一个问题;)
  • 这不是未定义的行为。
  • 无论是structs、数组还是简单变量(如charint等),全局变量和静态变量总是初始化为0。

标签: c c89


【解决方案1】:

对于全局结构,所有字段都将初始化为 0 / NULL。这在当前C standard的第6.7.9p10节中有详细说明:

如果具有自动存储持续时间的对象未初始化 明确地说,它的值是不确定的。如果一个物体有静电 或者线程存储时长没有显式初始化,则:

  • 如果有指针类型,则初始化为空指针;
  • 如果它具有算术类型,则将其初始化为(正或无符号)零;
  • 如果是聚合,则每个成员都根据这些规则进行初始化(递归),任何填充都初始化为零位;
  • 如果是联合,则根据这些规则(递归)初始化第一个命名成员,并初始化任何填充 零位;

旧的C89 standard 在第 3.5.7 节中有类似的语言:

具有静态存储持续时间的对象未初始化 显式地,它被隐式初始化,就好像每个具有 算术类型被分配 0 并且每个具有指针类型的成员 被分配了一个空指针常量。如果一个对象具有自动 存储持续时间未显式初始化,其值为 不确定

...

如果聚合包含聚合或联合的成员,或者如果 联合的第一个成员是聚合或联合,规则适用 递归到子聚合或包含的联合

因此,在您的情况下,instance.a 保证设置为 0。

【讨论】:

  • 谢谢!你的摘录完美地解释了它。在阅读 If there are fewer initializers in a list than there are members of an aggregate, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration. 之前,我对经常引用的 C99 段落和通过 C89 标准的 CTRL+F 感到有点困惑,只是被语言和 C99 在等效的段落。
猜你喜欢
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 2021-03-27
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多