命名空間
變體
動作

初始化

出自 cppreference.com
< c‎ | 語言

物件的宣告可以透過稱為初始化的過程提供其初始值。

對於每個宣告子,若初始設定式(initializer)未被省略,則可以是以下形式之一:

= 運算式 (1)
= { 初始化列表 } (2)
= { } (3) (C23 起)

其中初始化列表是一個非空的、以逗號分隔的初始化設定式列表(可包含尾隨逗號),每個初始化設定式具有以下三種可能形式之一:

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

其中指示符列表是由陣列指示符(形式為 [ 常數表達式 ])或結構體/聯合體成員指示符(形式為 . 識別字)組成的列表;請參見陣列初始化結構體初始化

注意:除了初始化設定式外,括在花括號中的初始化列表還可出現在複合字面值中,其形式為:

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

目錄

[編輯] 說明

初始化設定式指定了儲存在物件中的初始值。

[編輯] 顯式初始化

若提供了初始化設定式,請參見:

[編輯] 隱式初始化

若未提供初始化設定式:

  • 具有自動儲存期的物件會被初始化為不確定值(可能為陷阱表示)。
  • 具有靜態與執行緒區域儲存期的物件會被空初始化。

[編輯] 空初始化

若一個物件透過初始化設定式 = {} 顯式初始化,則稱該物件被空初始化。

(C23 起)

在某些情況下,若物件未顯式初始化,則會進行空初始化,即:

  • 指標被初始化為其類型的空指標值
  • 整數類型的物件被初始化為無符號的零
  • 浮點類型的物件被初始化為正零
  • 陣列的所有元素、結構體的所有成員,以及聯合體的第一個成員會遞迴地進行空初始化,此外所有填充位元(padding bits)均被初始化為零
(在空指標值和浮點零均為全位元零表示的平台上,這種靜態物件的初始化通常是透過在程式映像的 .bss 段中進行分配來實現的)

[編輯] 附註

在初始化具有靜態或執行緒區域儲存期的物件時,初始化設定式中的每個表達式都必須是常數表達式字串字面值

初始化設定式不能用於不完整類型、VLA(變長陣列)以及具有連結性的區塊作用域物件的宣告中。

函式參數的初始值是如同透過函式呼叫的引數賦值而建立的,而非透過初始化。

若將不確定值作為引數傳遞給任何標準函式庫呼叫,其行為是未定義的。否則,任何涉及不確定值的表達式結果均為不確定值(例如:int n;n 可能與自身比較不相等,且在後續讀取時值可能會發生變化)。

C 語言中沒有對應於 C++ 值初始化(value initialization)的特殊結構;然而,可以使用 = {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++ 文件 關於 初始化
English Deutsch 日本語 中文(简体) 中文(繁體)