C结构体成员是否保证被初始化为0?

3
当我在C语言中声明一个结构体时,是否保证成员变量会被初始化为某个特定的值,例如对于整型成员变量,是否会被初始化为0?
编辑:假设我有一个结构体,它看起来像这样:
typedef struct
{
     int a;
} my_str;

我声明:

my_str thing1;

全局的。根据一些答案,thing1.a将被初始化为0 - 我理解得对吗?


是的,你理解得很正确。 - hrnt
其他人已经引用了标准,但我想指出,在使用变量之前,应该初始化所有变量。这样你和其他阅读你代码的人就不必考虑这些规则,而且更加清晰明了。 - BobbyShaftoe
6个回答

7
只有具有静态存储期的变量(全局变量,函数中的静态变量)才能保证初始化为0。没有其他保证。

7

C99标准相关部分:

第6.2.4节, §3:

具有外部或内部链接或使用静态存储类别说明符声明的标识符的对象具有静态存储期。它的生命周期是整个程序的执行过程,其存储值仅在程序启动前初始化一次。

第6.2.4节, §4:

没有链接并且没有使用静态存储类别说明符声明的标识符的对象具有自动存储期。

第6.2.4节, §5 (关于具有自动存储期的对象):

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

第6.7.8节, §10:

如果未显式初始化具有自动存储期的对象,则其值是不确定的。如果未显式初始化具有静态存储期的对象,则:

— 如果它具有指针类型,则将其初始化为 null 指针;

— 如果它具有算术类型,则将其初始化为(正的或无符号的)零;

— 如果它是一个聚合体,则每个成员都按照这些规则递归初始化;

— 如果它是一个联合体,则第一个命名成员按照这些规则递归初始化。


1

根据ANSI C标准:如果一个具有静态存储期的对象没有显式初始化,那么它将被隐式初始化,就好像每个具有算术类型的成员都被赋值为0,每个具有指针类型的成员都被赋值为null指针常量。如果一个具有自动存储期的对象没有显式初始化,则其值是不确定的。


0
在C++中,结构体可以有一个带有初始化列表的构造函数来执行自动初始化。
结构体是一种数据类型,类型并不确定初始化。存储类别决定了初始化。因此,结构体类型的静态分配对象将像任何其他静态对象一样被初始化为零。使用static关键字声明的任何对象或在函数范围之外声明的对象都是静态分配的。

-1

不。

例如,MS VC++编译器将在调试构建中将结构成员初始化为零,并且不会在发布构建中将成员初始化为零。


可能应该搜索一下...“我的项目在使用MS VC ++的调试模式下可以运行,但在发布模式下却不行”。我无法相信他们的编译器会这样工作。 - blak3r

-1

不,没有这样的保证。如果你想让它们被初始化为零,除非结构变量被声明为全局变量,否则基本上需要手动完成。

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


1
即使它不是全局变量,本地静态变量也会被零初始化。 - Pavel Minaev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接