空的初始化器和结构体的初始化器之间有什么区别?

时间:2016-11-09 23:37:49

标签: c struct initializer

我遇到了类似的代码:

struct Struct
{
    int a;
    int b;
};

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

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

struct Struct variable;

或者是吗? 是否有一个空的初始化程序与不具有初始化程序的任何方式不同?

我的小C手册说明了

  

对于没有初始化的变量:所有具有静态作用域的变量都隐式初始化为零(即所有字节= 0)。所有其他变量都有未定义的值!

需要注意的是,这并未明确提及struct 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 没有初始化列表初始化为0,这与我的小C书所说的相反。

这些初始化列表如何与结构完全一致?

1 个答案:

答案 0 :(得分:5)

主要区别在于空的初始化程序:

struct Struct variable = { };

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

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

struct Struct variable = { 0 };

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

如果没有初始化程序,则具有静态存储持续时间的对象(在具有static关键字的任何函数之外定义)将初始化为零。具有自动存储持续时间的对象(在函数内部且没有static关键字)根本没有初始化,其内容将是垃圾。

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

  

对于没有初始化的变量:所有具有静态范围的变量   隐式初始化为零(即所有字节= 0)。 所有   其他变量有未定义的值!

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

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