结构的空初始化程序和无初始化程序有什么区别?

What's the difference between an empty initialiser and no initialiser for a struct?

我遇到了一些与此类似的代码:

struct Struct
{
    int a;
    int b;
};

int main()
{
    struct Struct variable = { };   // ???
    variable.a = 4;
    variable.b = 6;
}

这很奇怪。 ab 的初始化可能发生在初始化程序中(在大括号之间)。但他们不是。保留 = { } 部分有什么意义?下面的应该就可以了吧?

struct Struct variable;

或者是吗? 有一个空的初始化器和没有初始化器有什么不同吗?

我的小型 C 手册指出

For variables without an initialiser: All variables with static scope are implicitly initialised with zero (that is all bytes = 0). All other variables have undefined values!

需要注意的是,这并没有明确提及 structs。 没有初始化器的条件何时满足struct的字段?我做了以下测试:

#include <stdio.h>

struct Struct
{
    int a;
    int b;
};

int main()
{
    struct Struct foo = { };
    foo.a = 4;

    struct Struct bar;
    bar.a = 4;

    printf("with list:\t %i\n", foo.b);
    printf("without list:\t %i\n", bar.b);
}

结果为:

with list:   0
without list:    32765

这令人困惑。 struct without 初始化列表确实 not 初始化为 0,这与我的小 C 书所说的相反。

这些初始化列表如何与结构一起工作?

主要区别在于空的初始值设定项:

struct Struct variable = { };

是标准 C 中的语法错误。(您的编译器可能支持它作为扩展。)

具有有效的初始值设定项,例如:

struct Struct variable = { 0 };

... = { 0 } 对任何类型都有效),任何未给出显式值的成员都将隐式初始化为零。

在没有初始化器的情况下,具有静态存储持续时间的对象(在使用 static 关键字的任何函数 之外定义)被初始化为零。具有自动存储持续时间的对象(在函数内并且没有 static 关键字)根本不会被初始化,它的内容将是垃圾。

事实上,这正是您的 C 书所说的:

For variables without an initialiser: All variables with static scope are implicitly initialised with zero (that is all bytes = 0). All other variables have undefined values!

(应该说存储持续时间而不是范围,并且初始化不一定是按字节进行的,但除此之外它基本上是正确的。)

请注意,"zero" 不一定是全位 0,尽管这是实现它的常用方法。该语言要求的是每个成员(对于结构),或第一个成员(对于联合),或每个元素(对于数组)都初始化为零,递归地应用规则直到你得到指针(初始化为 NULL)、整数(初始化为0)或浮点对象(初始化为0.0)。空指针和浮点数 0.0 通常 表示为全位 0,但语言并不要求它们是。