c结构的成员是否保证初始化为0?

时间:2009-10-01 16:43:05

标签: c

当我在C中声明一个结构时,我保证会将成员初始化为某个特定值,例如0表示整数成员吗?

修改

所以,假设我有一个看起来像这样的结构:

typedef struct
{
     int a;
} my_str;

我宣布:

my_str thing1;

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

6 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:7)

C99标准的相关部分:

第6.2.4节,§3:

  

声明标识符的对象   与外部或内部联系,或   使用存储类说明符   static具有静态存储持续时间。   它的生命周期是整个执行   该程序及其存储值是   在此之前仅初始化一次   程序启动。

第6.2.4节,§4:

  

声明标识符的对象   没有联系,没有联系   存储类说明符静态   自动存储时间。

6.2.4节,§5(关于具有自动存储持续时间的对象):

  

对象的初始值是   不定。如果初始化是   为对象指定,它是   每次声明时都会执行   在执行该块时达成;   否则,价值变为   每次都不确定   宣言已经达成。

第6.7.8节,第10节:

  

如果对象具有自动功能   存储持续时间未初始化   显然,它的价值是   不定。如果有一个对象   静态存储持续时间不是   显式初始化,然后:

     

- 如果是的话   有指针类型,它被初始化为   空指针;

     

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

     

- 如果是的话   聚合,每个成员都被初始化   (递归地)根据这些   规则;

     

- 如果它是一个联盟,那么第一个   命名成员已初始化   (递归地)根据这些   规则。

答案 2 :(得分:1)

来自ANSI C standard:如果没有显式初始化具有静态存储持续时间的对象,则会隐式初始化它,就好像每个成员都有 算术类型被赋值为0,每个成员都有指针类型 被赋予空指针常量。如果有一个对象 自动存储持续时间未明确初始化,其值为 不确定

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

没有

例如,对于调试版本,MS VC ++编译器会将struct成员初始化为零,并且不会为发布版本将成员初始化为零。

答案 5 :(得分:-1)

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

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