許多 C 語言初學者會遇到這個編譯錯誤:結構體變量定義後,試圖用 {1,2,3,4,5} 為內部陣列賦值,編譯器報錯「expected expression before '{' token」。本文解析根本原因並給出三種正確解法。
struct A {
int length;
int c[5];
} b; // 全域/靜態變量,程式啟動前已分配記憶體
int main() {
b.c = {1, 2, 3, 4, 5}; // ❌ 編譯錯誤!
return 0;
}
{} 僅用於初始化,不屬於賦值表達式type var = { ... };,編譯期完成記憶體佈局var = expr;,{...} 不是合法表達式陣列 b.c 在 main 執行前已分配完畢,此時只能逐元素賦值。
struct A {
int length;
int c[5];
} b = {0, 1, 2, 3, 4, 5}; // 0→length, 1~5→c[0]~c[4]
按成員聲明順序依次填入,編譯器自動完成陣列展開。
int main() {
struct A b;
for (int i = 0; i < 5; i++)
b.c[i] = i + 1;
return 0;
}
適用於動態計算值、條件賦值等場景,無位置依賴。
int main() {
struct A b;
b = (struct A){0, {1, 2, 3, 4, 5}}; // 構造臨時結構體整體拷貝
return 0;
}
需編譯器支援 C99(GCC/Clang 預設開啟,MSVC 需 /std:c11 或更新版)。
struct S { char str[10]; } s;
// s.str = "hello"; ❌ 錯誤
strcpy(s.str, "hello"); // ✅ 正確
// 或定義時初始化
struct S s = {"hello"};
定義時用大括號初始化;定義後用迴圈或函數逐個賦值。
理解「初始化」與「賦值」的本質區別,是避開 C 語言陣列/結構體賦值陷阱的關鍵。