代码之家  ›  专栏  ›  技术社区  ›  FrostKiwi

初始化了全局结构,并且在beheviour中定义了未初始化的成员int?

c89 c
  •  2
  • FrostKiwi  · 技术社区  · 7 年前

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

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

    总是打印 0 还是技术上没有定义?

    1 回复  |  直到 7 年前
        1
  •  3
  •   dbush    7 年前

    对于全局结构,所有字段都将初始化为0/NULL。详见本规范第6.7.9p10节 C standard :

    如果具有自动存储持续时间的对象未初始化 显然,它的值是不确定的。如果一个对象 或者线程存储持续时间未显式初始化,则:

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

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

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

    ...

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

    所以对你来说, instance.a 保证设置为0。