C語言陣列初始化完整教學:靜態、動態、多維與零初始化一次搞懂

1. 前言

C 語言中陣列的初始化是程式設計的第一步,同時也是非常重要的環節。如果沒有正確初始化,很容易導致預期外的 bug 或錯誤。本文將針對初學者到中階使用者,分步說明陣列的初始化方式,並提供實用小提示,幫助你更上一層樓,成為陣列初始化的高手!

2. 什麼是陣列?C 語言中的角色

陣列是一種可以一次處理多個相同資料型態數值的方便結構。例如,若要存放 30 位同學的考試分數,使用陣列會比一個個宣告變數來得高效得多。

範例:陣列宣告

int scores[30];

這段程式碼就建立了一個可以存放 30 筆分數的陣列。

使用陣列時要注意,未初始化的陣列裡可能包含不確定的資料。因此,正確的初始化非常重要。

3. 基本的陣列初始化方法

宣告陣列的同時也可以直接初始化,這有助於在程式執行時預先設定好所需資料。

範例1:宣告時直接初始化

int arr[3] = {1, 2, 3};

這段程式碼宣告了一個有三個元素的陣列 arr,並為每個元素分別指定值。在 C 語言中,有時可以省略陣列大小,編譯器會自動依據初始值推斷大小。

範例2:省略大小的初始化

int arr[] = {1, 2, 3};

這種寫法下,陣列的大小會根據初始值的個數自動推斷。

小提示:

有時候明確寫出陣列大小會更清楚,但省略大小也能讓程式更簡潔、更容易閱讀。

4. 部分初始化

若只針對部分元素初始化,未指定的元素會自動設為 0。這在只需要為部分元素指定值時特別有用。

範例:部分初始化

int arr[5] = {1, 2}; // 剩下的元素自動為 0

這裡,前兩個元素分別被初始化為 12,其他元素則自動設為 0。這種方式對於大型陣列或僅需設定部分初始值時很方便。

5. 全部元素設為零

若要將所有元素初始化為 0,可以這樣簡潔地寫:

範例:全部設為 0 的初始化

int arr[5] = {0}; // 所有元素都會是 0

這種寫法對於需要全部清零的大型陣列非常實用。如果是大量元素的情況,也可以用 memset 函數來快速初始化。

範例:使用 memset 清零

memset(arr, 0, sizeof(arr));

memset 可以快速地將大陣列全部初始化為 0。

6. 多維陣列的初始化

C 語言也能輕鬆處理二維、三維等多維陣列,這對於處理矩陣或複雜資料集很有幫助。

範例:二維陣列初始化

int arr[2][3] = {
{1, 2, 3},
{4, 5, 6}
};

這裡宣告了一個 2 行 3 列的陣列,並為每一行指定初始值。

範例:三維陣列初始化

int tensor[2][2][2] = {
{{1, 2}, {3, 4}},
{{5, 6}, {7, 8}}
};

這是個 2x2x2 的三維陣列,每個元素都有初始值。使用多維陣列時,請留意陣列大小與初始值的對應順序。

7. 動態陣列初始化

如果陣列大小在執行時才決定,可以用 malloc 動態配置記憶體。這對於大小不固定的情境非常有用。

範例:動態陣列初始化

int *arr = (int *)malloc(5 * sizeof(int));
for (int i = 0; i < 5; i++) {
arr[i] = i;
}

這個例子用 malloc 配置了記憶體,並用迴圈給每個元素賦值。

避免記憶體洩漏:

動態分配的記憶體,用完後一定要記得用 free 釋放,否則會產生記憶體洩漏,浪費系統資源。

free(arr);

加入錯誤處理:

建議在動態記憶體分配時,也檢查是否分配成功。

if (arr == NULL) {
printf(“記憶體分配失敗。
“);
}

8. 常見錯誤與最佳實踐

未初始化陣列的風險:

C 語言宣告陣列時,不會自動初始化。若使用未初始化的陣列,可能殘留不確定的資料,造成不可預期的 bug。請務必主動初始化。

#define 管理大小:

利用 #define 巨集管理陣列大小,有助於未來維護及修改。

define SIZE 5

int arr[SIZE];

9. 結論

陣列初始化是 C 語言程式設計的基本功,做好可以大幅提升程式穩定性。本文介紹的各種技巧,如零初始化、部分初始化、多維陣列、動態記憶體管理等,都能幫助你避免 bug,寫出更有效率的程式。請善用這些知識,挑戰更進階的專案吧!