c struct的成员是否保证被初始化为0?

问题描述:

当我在C中声明一个结构体时,我是否保证成员将被初始化为某个特定的值,例如整型成员为0?c struct的成员是否保证被初始化为0?

编辑:

所以,让我们说我有一个结构,看起来像:

typedef struct 
{ 
    int a; 
} my_str; 

,我宣布:

my_str thing1; 

全球。根据一些答案,thing1.a将被初始化为0 - 我是否理解正确?

+0

是的,你正确理解这一点。 – hrnt 2009-10-01 17:30:48

+0

其他人已经引用了标准,但我想指出,应该在使用它们之前初始化所有变量。这样,你和其他阅读你的代码的人就不必考虑这样的规则,它就更加清晰。 – BobbyShaftoe 2009-10-01 19:52:07

C99标准的相关部分:

部分6.2.4,§3:

一个目的其标识符被声明为 ,具有外部或内部链接,或 与存储级说明符 static具有静态存储持续时间。 它的使用寿命是程序的整个执行 并且它的存储值是 只有在 程序启动之前初始化一次。

部分6.2.4,§4:

一个对象,其识别符被声明 没有连锁和没有 存储类说明静态具有 自动存储持续时间。

section 6.2。4,§5(关于具有自动存储持续时间的对象):

该对象的初始值是 不确定。如果为该对象指定了一个初始化为 ,则在执行该块时每执行一次声明为 就执行 ; 否则,每次达到 声明时,该值将变为 不确定。

部分6.7.8,§10:

如果具有自动 存储持续时间的对象没有初始化 明确地,它的值是 不确定的。如果具有 静态存储持续时间的对象是不明确 初始化,则:

- 如果它 具有指针类型,它被初始化为 一个空指针;

- 如果它有算术 类型,则它初始化为(正数 或无符号数)零;

- 如果它是一个 聚集体,每一个成员是 (递归地)根据这些规则 初始化;根据这些 规则,初始化 (递归)。

您只能保证具有静态存储持续时间的变量(全局变量,函数中的静态变量)被初始化为0.没有其他保证。

例如,MS VC++编译器将结构成员初始化为零调试版本,以及用于发布版本不会初始化成员为零。

+0

可能应该搜索...“我的项目在调试模式下工作,但不能在MS VC++的发布模式下工作”。我不敢相信他们的编译器是这样的。 – blak3r 2009-10-01 17:08:17

不,没有这样的保证。如果您希望将它们初始化为零,则需要手动完成这些操作,除非将结构变量声明为全局。

编辑:是的,我忘了提及一个函数内的静态变量。

+1

本地静态变量也是零初始化的,尽管它不是全局的。 – 2009-10-01 17:35:44

ANSI C standard:如果具有静态存储持续时间的对象没有明确初始化时,它被隐含初始化为如果每一个具有 算术型部件被分配0和每一个具有指针类型 构件被分配一个空指针不变。如果具有 自动存储持续时间的对象没有被明确初始化,它的值是不确定的

在C++中,struct可以有一个带有初始化列表的构造函数来执行自动初始化。

结构是一种数据类型,类型不决定初始化。存储类确定初始化。所以一个静态分配的struct类型的对象将会。像任何其他静态对象一样,被初始化为零。静态分配任何以关键字静态声明或在函数作用域外声明的对象。