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)
这很奇怪.初始化a和b可能在初始化器中发生(在花括号之间).但他们不是.保持这个= { }部分有什么意义?以下应该没问题吧?
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语言书中说.
这些初始化列表如何与结构完全一致?
主要的区别是一个空的初始化器:
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,但语言不需要它们.