当我在C中声明一个结构时,我保证会将成员初始化为某个特定值,例如0表示整数成员吗?
修改
所以,假设我有一个看起来像这样的结构:
typedef struct
{
int a;
} my_str;
我宣布:
my_str thing1;
全球。根据一些答案,thing1.a将被初始化为0 - 我是否理解正确?
答案 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)
没有。没有这样的保证。如果您希望将它们初始化为零,则几乎需要手动完成,除非结构变量被声明为全局。
编辑:是的,我忘了在函数中提到静态变量。