C 語言初始化規則看似繁瑣,實則邏輯自洽。本文系統梳理標量、數組(含多維/字符)、結構體、指針、靜態存儲期變量的初始化語法與陷阱。
int a = 12;
char c = 'a';
float f = 12.3f;
double d = 1.23;
_Bool flag = 1; // C99
char s1[] = "hello"; // 推薦:自動含 \0,長度 6
char s2[10] = "hello"; // 剩餘補 \0
char *p = "hello"; // 指向字符串常量區,不可修改
char s3[] = {'h','e','l','l','o','\0'}; // 繁瑣不推薦
int a1[] = {1,2,3,4,5}; // 長度推導為 5
int a2[5] = {1}; // 首元素 1,其餘 0
int a3[5] = {[2] = 10}; // C99 指定初始化器,a3[2]=10,其餘 0
int m1[2][3] = {{1,2,3},{4,5,6}}; // 完整
int m2[][3] = {{1,2,3},{4,5,6}}; // 第一維可省略
int m3[2][3] = {1,2,3,4,5,6}; // 扁平化按行主序填充
int *rows[3]; // 指針數組(鋸齒數組),需 malloc 每行
typedef struct { int id; int age; char *name; } Person;
// C99 指定初始化器(推薦,順序無關、可選字段)
Person p1 = { .id = 1, .age = 20, .name = "Tom" };
// 傳統順序初始化
Person p2 = { 2, 25, "Jerry" };
// 指針動態分配
Person *p3 = malloc(sizeof(Person));
if (p3) { p3->id = 3; p3->age = 30; p3->name = strdup("Bob"); }
// 複合字面量(C99,臨時對象)
Person p4 = (Person){ .id = 4, .name = "Alice" };
char *p = "lit" 指向只讀區,char a[] = "lit" 在棧上可修改。struct { int len; char data[]; } 需 malloc(sizeof(Struct) + len)。int n; scanf("%d",&n); int a[n]; 僅限塊作用域,不能初始化。C 初始化核心原則:**顯式優於隱式、編譯期優於運行期、指定初始化器優於順序**。掌握存儲期與初始化規則的交互,能消除 80% 的未定義行為 Bug。