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

C99 複合字面量完全指南:簡潔構建匿名陣列與結構體

     編輯:關於C語言

C99 複合字面量完全指南:簡潔構建匿名陣列與結構體

複合字面量 是 C99 引入的強大特性,允許在任何需要值的地方以字面量語法構建陣列、結構體、聯合體,並產生指向該匿名物件的指標。極大簡化臨時資料結構的建構與傳遞。

語法形式

(型別名) { 初始化列表 }
// 例:
(int[]) {1, 2, 3}
(struct Point) {.x = 10, .y = 20}

核心特性

  • 可賦值給指標:int *p = (int[]){1,2,3};
  • 可作為函數參數直接傳遞:foo((int[]){1,2,3});
  • 可指定陣列大小:(int[10]){0} → 全零初始化。
  • 支援巢狀結構:(struct S[]){{1}, {2}}
  • 可作左值修改:(int[]){1,2,3}[1] = 99;
  • 儲存期:區塊域內為自動儲存期(離開區塊失效),檔案域為靜態儲存期。

實戰範例

1. 簡化函數呼叫:避免臨時變數

typedef struct { void *data; int len; } Array;
void process(Array *a);

// 傳統寫法
int tmp[] = {1,2,3};
Array arr = {tmp, 3};
process(&arr);

// 複合字面量一行搞定
process(&(Array){ (int[]){1,2,3}, 3 });

2. 結構體陣列初始化

typedef struct { int id; char *name; } Student;
Student *class = (Student[]) {
    {1, "Alice"},
    {2, "Bob"},
    {3, "Charlie"}
};

3. 動態指定大小

int n = 100;
int *buf = (int[n]){0}; // VLA 風格,C99 支援
// 等價於 malloc 但自動釋放(區塊結束)

4. 作為左值修改

(int[3]){10, 20, 30}[1] = 200; // 合法,修改匿名陣列元素

注意事項

  • 生命週期:區塊域內的複合字面量在區塊結束時銷毀,不可返回其指標離開區塊。
  • 唯讀性:字串字面量 (char[]){"abc"} 可修改,但 "abc" 為唯讀。
  • 型別相容:(int[]){1} 型別為 int *,非 int[1]。

總結:何時使用

場景優勢
一次性函數參數免宣告臨時變數,程式碼緊湊
結構體/陣列初始化支援指定初始化器,可讀性強
測試/原型代碼快速構建測試資料
避免 malloc/free自動儲存期管理,無洩漏風險
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved