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

nul*_*ull 1 c struct initializer

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

struct Struct
{
    int a;
    int b;
};

int main()
{
    struct Struct variable = { };   // ???
    variable.a = 4;
    variable.b = 6;
}
Run Code Online (Sandbox Code Playgroud)

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

struct Struct variable;
Run Code Online (Sandbox Code Playgroud)

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

我的小C手册说明了这一点

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

需要注意的是,这并没有明确提到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);
}
Run Code Online (Sandbox Code Playgroud)

结果是:

with list:   0
without list:    32765
Run Code Online (Sandbox Code Playgroud)

这令人困惑.在struct 没有一个初始化器列表并没有得到初始化为0,相反的是我的小本C语言书中说.

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

Kei*_*son 5

主要的区别是一个空的初始化器:

struct Struct variable = { };
Run Code Online (Sandbox Code Playgroud)

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

使用有效的初始化程序,例如:

struct Struct variable = { 0 };
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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