int a[2][2] = {1, {}, 3}; // 報錯
char a[2] = {1, ''}; // 報錯 (單引號內為空)
int a[2][2] = {{1,2}, {}}; // 追問:這個呢?
C 標準**不存在「空元素」概念**。數組初始化列表中,**每個初始化項必須是合法的表達式**;
{}(空初始化列表) 在 C89/C99/C11 中**均為非法** (C++ 允許{}零初始化,但 C 不支持)。
| 代碼 | 錯誤原因 | 編譯器典型報錯 |
|---|---|---|
int a[2][2] = {1, {}, 3}; | {} 非法初始化項;結構不匹配 (期望 4 個 int 或 2 個子列表) | expected expression before '}' token |
char a[2] = {1, ''}; | '' 空字符常量非法 (單引號必須包含一個字符或轉義序列) | empty character constant |
int a[2][2] = {{1,2}, {}}; | 同第一條,子列表 {} 非法 | 同前 |
int a[2][2] = {{1, 2}, {3, 4}};
char b[2] = {'A', 'B'};
int a[2][2] = {{1, 2}}; // 等價於 {{1,2}, {0,0}}
int b[3][3] = {[1][1] = 5}; // C99 指定初始化器,其餘為 0
char str[10] = "Hi"; // 等價於 {'H','i','\0',0,0,0,0,0,0,0}
char c[2] = {0}; // 全零初始化,最簡潔
| 語義 | 整型數組 | 字符數組 | 指針數組 |
|---|---|---|---|
| 未使用/空槽 | 0 或 -1 (配合標記陣列) | '\0' 或 0 | NULL |
| 佔位符 | {0} 零初始化整個數組 | "" (空字符串) | {NULL} |
/* 修正:用 0 或 ' ' 佔位,而非 {} 或 '' */
int a[2][2] = {{1, 2}, {0, 0}}; // 或直接 {{1,2}} 利用零初始化
char b[2] = {'1', ' '}; // ' ' 空格字符 ASCII 32
/* 或 */
char b[2] = {'1', '\0'}; // 明確以空字符結尾
C 語言數組初始化**不支持空元素佔位符 {} 或 ''**。正確做法是:
{1,2} → 其餘為 0)。0/-1,字符用 '\0'/' ',指針用 NULL)。[index]=value) 精確控制特定位置。理解「初始化列表項必須是表達式」這一規則,即可避開所有「空元素」相關編譯錯誤。