C99 引入的複合字面量,讓陣列、結構體能像純量常值一樣「即時建立、即時使用」,極大提升程式碼表達力與簡潔度。
(型別) { 初始化列表 }
// 回傳:指向匿名物件的指標(左值)
// 即時建立 int 陣列指標
int *arr1 = (int[]) {1, 2, 3};
int *arr2 = (int[10]) {0}; // 指定大小,其餘補 0
// 重新指派(舊陣列若無其他引用將洩漏,除非靜態儲存期)
arr1 = (int[]) {4, 5, 6};
// 傳遞給函數(最常見用法)
void process(int *data, int len);
process((int[]) {10, 20, 30}, 3); // 無需命名變數
typedef struct {
void *data;
int len;
} Array;
Array *a1 = (Array[]) {{NULL, 0}}; // 陣列包含 1 個結構體
Array *a2 = (Array[1]) {{(int[]){42}, 1}}; // 巢狀:結構體含陣列指標
// 函數呼叫時即時建構
void foo(Array *arr);
foo((Array[]) {{(int[]){1,2,3}, 3}});
// 檔案作用域:靜態儲存期,程式啟動時建立,結束時銷毀
static const Array *CONFIG = (Array[]) {
{(int[10]){0}, 10}, // 預設緩衝區
{(int[]){1,2,3}, 3} // 預設參數
};
int *p = (int[]){1,2,3};
p[0] = 99; // 合法!複合字面量是左值
int *q = &p[1]; // 可取元素址
// 甚至可對整個字面量取址(指向陣列的指標)
int (*arrPtr)[3] = &(int[3]){1,2,3};
| 位置 | 儲存期 | 生命週期 |
|---|---|---|
| 區塊作用域 (函數內) | 自動 | 進入區塊建立,離開區塊銷毀 |
| 檔案作用域 (全域) | 靜態 | 程式啟動建立,結束銷毀 |