首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言數組初始化:關於「空元素」的合法性與正確寫法

     編輯:C 語言問答

原帖疑問

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}, {}};同第一條,子列表 {} 非法同前

正確初始化寫法大全

1. 完全初始化 (所有元素顯式給值)

int a[2][2] = {{1, 2}, {3, 4}};
char b[2] = {'A', 'B'};

2. 部分初始化 (剩餘元素自動零初始化)

int a[2][2] = {{1, 2}};        // 等價於 {{1,2}, {0,0}}
int b[3][3] = {[1][1] = 5};    // C99 指定初始化器,其餘為 0

3. 字符數組特殊:字符串字面量自動補 \0

char str[10] = "Hi";   // 等價於 {'H','i','\0',0,0,0,0,0,0,0}
char c[2] = {0};       // 全零初始化,最簡潔

4. 明確表示「空/無效」的工程慣用語

語義整型數組字符數組指針數組
未使用/空槽0 或 -1 (配合標記陣列)'\0' 或 0NULL
佔位符{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. 利用**部分初始化自動零填充** ({1,2} → 其餘為 0)。
  2. 顯式寫入**語義上的空值** (整型用 0/-1,字符用 '\0'/' ',指針用 NULL)。
  3. C99 **指定初始化器** ([index]=value) 精確控制特定位置。

理解「初始化列表項必須是表達式」這一規則,即可避開所有「空元素」相關編譯錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved