结构的空初始化程序和无初始化程序有什么区别?
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;
}
这很奇怪。 a
和 b
的初始化可能发生在初始化程序中(在大括号之间)。但他们不是。保留 = { }
部分有什么意义?下面的应该就可以了吧?
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!
需要注意的是,这并没有明确提及 struct
s。
没有初始化器的条件何时满足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,但语言并不要求它们是。
我遇到了一些与此类似的代码:
struct Struct
{
int a;
int b;
};
int main()
{
struct Struct variable = { }; // ???
variable.a = 4;
variable.b = 6;
}
这很奇怪。 a
和 b
的初始化可能发生在初始化程序中(在大括号之间)。但他们不是。保留 = { }
部分有什么意义?下面的应该就可以了吧?
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!
需要注意的是,这并没有明确提及 struct
s。
没有初始化器的条件何时满足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,但语言并不要求它们是。