複合字面量 是 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;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 });
typedef struct { int id; char *name; } Student;
Student *class = (Student[]) {
{1, "Alice"},
{2, "Bob"},
{3, "Charlie"}
};
int n = 100;
int *buf = (int[n]){0}; // VLA 風格,C99 支援
// 等價於 malloc 但自動釋放(區塊結束)
(int[3]){10, 20, 30}[1] = 200; // 合法,修改匿名陣列元素
(char[]){"abc"} 可修改,但 "abc" 為唯讀。(int[]){1} 型別為 int *,非 int[1]。| 場景 | 優勢 |
|---|---|
| 一次性函數參數 | 免宣告臨時變數,程式碼緊湊 |
| 結構體/陣列初始化 | 支援指定初始化器,可讀性強 |
| 測試/原型代碼 | 快速構建測試資料 |
| 避免 malloc/free | 自動儲存期管理,無洩漏風險 |