我遇到了类似的代码:
struct Struct
{
int a;
int b;
};
int main()
{
struct Struct variable = { }; // ???
variable.a = 4;
variable.b = 6;
}
这很奇怪。 a
和b
的初始化可能发生在初始化程序(大括号之间)中。但他们不是。保持= { }
部分有什么意义?以下应该没问题吧?
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书所说的相反。
这些初始化列表如何与结构完全一致?
答案 0 :(得分:5)
主要区别在于空的初始化程序:
struct Struct variable = { };
是标准C中的语法错误。(您的编译器可能支持它作为扩展。)
使用有效的初始值设定项,例如:
struct Struct variable = { 0 };
(... = { 0 }
对任何类型都有效),任何未给定显式值的成员都会被隐式初始化为零。
如果没有初始化程序,则具有静态存储持续时间的对象(在具有static
关键字的任何函数或之外定义)将初始化为零。具有自动存储持续时间的对象(在函数内部且没有static
关键字)根本没有初始化,其内容将是垃圾。
事实上,这正是你的C书所说的:
对于没有初始化的变量:所有具有静态范围的变量 隐式初始化为零(即所有字节= 0)。 所有 其他变量有未定义的值!
(它应该说是存储持续时间而不是范围,并且初始化不一定是字节顺序,但除此之外它基本上是正确的。)
请注意&#34;零&#34;不一定是全位0,尽管这是实现它的常用方法。该语言需要的是每个成员(对于结构),或者第一个成员(对于联合),或者每个元素(对于数组)都被初始化为零,规则以递归方式应用,直到你得到指针(初始化为{{ 1}}),整数(初始化为NULL
)或浮点对象(初始化为0
)。空指针和浮点0.0
通常表示为全位0,但语言并不要求它们。