初始化
对象的声明可以通过称为初始化的过程来提供其初始值。
对于每个声明符,如果初始化器未被省略,则可以是以下之一
= expression |
(1) | ||||||||
= { initializer-list } |
(2) | ||||||||
= { }
|
(3) | (自 C23 起) | |||||||
其中 initializer-list 是一个非空的逗号分隔的 initializer 列表(带有可选的尾随逗号),其中每个 initializer 具有以下三种可能的形式之一
expression | (1) | ||||||||
{ initializer-list } |
(2) | ||||||||
{ }
|
(3) | (自 C23 起) | |||||||
designator-list = initializer |
(4) | (自 C99 起) | |||||||
其中 designator-list 是数组指示符列表,形式为 注意:除了初始化器,花括号括起来的 initializer-list 可能会出现在复合字面量中,复合字面量是以下形式的表达式
|
(自 C99 起) |
目录 |
[编辑] 解释
初始化器指定存储在对象中的初始值。
[编辑] 显式初始化
如果提供了初始化器,请参阅
[编辑] 隐式初始化
如果未提供初始化器
[编辑] 空初始化
如果对象从初始化器 = {} 显式初始化,则该对象被空初始化。 |
(自 C23 起) |
在某些情况下,如果对象未显式初始化,则该对象被空初始化,即
- 指针被初始化为它们类型的空指针值
- 整型对象被初始化为无符号零
- 浮点型对象被初始化为正零
- 数组的所有元素、结构体的所有成员以及联合体的第一个成员都被递归地空初始化,此外,所有填充位都被初始化为零
- (在空指针值和浮点零具有全零位表示的平台上,静态变量的这种初始化形式通常通过在程序映像的 .bss 段中分配它们来实现)
[编辑] 注解
当初始化静态或线程局部存储期的对象时,初始化器中的每个 expression 必须是常量表达式或字符串字面量。
初始化器不能用于不完整类型、VLA 和具有链接的块作用域对象的声明中。
函数参数的初始值是通过从函数调用的参数赋值来建立的,而不是通过初始化。
如果将不确定值用作任何标准库调用的参数,则行为是未定义的。 否则,任何涉及不确定值的表达式的结果都是不确定值(例如,int n;,n 可能不等于自身,并且在后续读取时可能看起来会更改其值)
在 C 中没有对应于 C++ 中的值初始化的特殊构造;但是,= {0}(或复合字面量中的 (T){0})(自 C99 起) 可以替代使用,因为 C 标准不允许空结构体、空联合体或零长度数组。 |
(直到 C23) |
空初始化器 = {} (或复合字面量中的 (T){})可以用于实现与 C++ 中的值初始化相同的语义。 |
(自 C23 起) |
[编辑] 示例
#include <stdlib.h> int a[2]; // initializes a to {0, 0} int main(void) { int i; // initializes i to an indeterminate value static int j; // initializes j to 0 int k = 1; // initializes k to 1 // initializes int x[3] to 1,3,5 // initializes int* p to &x[0] int x[] = { 1, 3, 5 }, *p = x; // initializes w (an array of two structs) to // { { {1,0,0}, 0}, { {2,0,0}, 0} } struct {int a[3], b;} w[] = {[0].a = {1}, [1].a[0] = 2}; // function call expression can be used for a local variable char* ptr = malloc(10); free(ptr); // Error: objects with static storage duration require constant initializers // static char* ptr = malloc(10); // Error: VLA cannot be initialized // int vla[n] = {0}; }
[编辑] 参考文献
- C17 标准 (ISO/IEC 9899:2018)
- 6.7.9 初始化 (p: 100-105)
- C11 标准 (ISO/IEC 9899:2011)
- 6.7.9 初始化 (p: 139-144)
- C99 标准 (ISO/IEC 9899:1999)
- 6.7.8 初始化 (p: 125-130)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 6.5.7 初始化
[编辑] 参见
C++ 文档 关于 初始化
|