命名空间
变体
操作

初始化

来自 cppreference.com
< c‎ | 语言

一个 声明 对象可以通过称为初始化的过程提供其初始值。

对于每个 声明符,如果未省略初始化器,则它可以是以下之一

= 表达式 (1)
= { 初始化器列表 } (2)
= { } (3) (自 C23 起)

其中 初始化器列表 是一个非空的逗号分隔的 初始化器 列表(可选的尾部逗号),其中每个初始化器具有以下三种可能的形式之一

表达式 (1)
{ 初始化器列表 } (2)
{ } (3) (自 C23 起)
指示符列表 = 初始化器 (4) (自 C99 起)

其中 指示符列表 是一个形式为 [ 常量表达式 ] 的数组指示符或形式为 . 标识符 的结构体/联合体成员指示符的列表;参见 数组初始化结构体初始化

注意:除了初始化器之外,大括号括起来的 初始化器列表 可能会出现在 复合字面量 中,它们是以下形式的表达式

( 类型 ) { 初始化器列表 }
( 类型 ) { } (自 C23 起)
(自 C99 起)

内容

[编辑] 解释

初始化器指定存储在对象中的初始值。

[编辑] 显式初始化

如果提供了初始化器,请参见

[编辑] 隐式初始化

如果没有提供初始化器

[编辑] 空初始化

如果对象被显式地从初始化器 = {} 初始化,则它被空初始化。

(自 C23 起)

在某些情况下,如果对象没有被显式地初始化,则它被空初始化,即

  • 指针被初始化为其类型的空指针值
  • 整型类型的对象被初始化为无符号零
  • 浮点类型的对象被初始化为正零
  • 数组的所有元素、结构体的所有成员以及联合体的第一个成员被空初始化,递归地,加上所有填充位被初始化为零
(在空指针值和浮点数零具有全零位表示的平台上,这种形式的静态初始化通常通过在程序映像的 .bss 部分中分配它们来实现)

[编辑] 注意

在初始化具有静态或线程局部 存储期限 的对象时,初始化器中的每个 表达式 必须是一个 常量表达式字符串字面量

初始化器不能用于声明不完整类型、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++ 文档 用于 初始化