名稱空間
變體
操作

初始化

來自 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++ 文件,關於初始化