Initialize an array in C\C++

一般寫C\C++的best practice要在variable初始化時給予初值,避免程式的執行不如預期,另一方面也可以增加可讀性。array的初始化也一樣要給予初值。但是array的初始化方法比較多,我們在這篇文章中給大家講解。

  1. 不給予初值的後果
  2. 給予初值的幾個方法
  3. 延伸閱讀

不給予初值的後果

當一般的local variable沒有給初值的話,不同的compiler會有不同的behavior。以VS 2013為例,使用沒給初值的local variable會產生以下error message:
without_init_val

但是如果是使用沒給初值的array的話,則不會有任何的error,但是array的內容為沒有意義的垃圾值:

int arr[5];

for (int ele : arr) {
    cout << ele;
}

以上程式的執行結果在VS 2013為:-858993460-858993460-858993460-858993460-858993460

給予初值的幾個方法

所以array在使用前,一定要給予初值。(方法不唯一)

方法1:

int arr1[5] = { 0, 1, 2, 3, 4 };
int arr2[] = { 0, 1, 2, 3, 4 };

一口氣把所有array的element填上,其中arr[5]的5可以被省略。

當init的elements的數量少於array的size時,其他elements會被init成0,以下程式的執行結果為:01200

int arr[5] = { 0, 1, 2 };

for (int ele : arr) {
    cout << ele;
}

若要把array init成0,可以把{0} assign給array。以下程式的執行結果為:00000

int arr[5] = {0};

for (int ele : arr) {
    cout << ele;
}

但是若要把整個array初值設為1時,不可以用以下方式:

int arr[5] = {1};

for (int ele : arr) {
    cout << ele;
}

以上程式的執行結果為:10000

方法2:

int arr[5];
memset(arr, 0, 5 * sizeof(int));

我們也可以透過memset來給予初值;但是需要自己算size,有時候會算錯,所以還是用{0}比較好。

但是allocate在heap上的array就沒辦法用{0}來給予初值了,所以常見的方法就是用memset。

int* arr = new int[5];
memset(arr, 0, 5 * sizeof(int));
delete[] arr;

方法3:

int* arr = new int[5]();

for (int i = 0; i < 5; ++i) {
    cout << arr[i];
}
cout << endl;

delete[] arr;

這個方法只適用於allocate在heap上的array,它會把0 assign給整個array。以上程式的執行結果為:00000

但是這個方法不能用來給予0以外的初值。以下程式在compile time會出現error:

int* arr = new int[5](1);

for (int i = 0; i < 5; ++i) {
    cout << arr[i];
}
cout << endl;

delete[] arr;

延伸閱讀

在C++ 11後,STL新增了一個std::array,有關std::array和傳統C-Style array的區別請參考這篇文章。另外static global variable和static local variable如果沒有給初值的話,compiler會自動給0當初值(請參考這篇文章),static的array也不例外,以下程式的執行結果為:00000

static int arr[5];

for (int i = 0; i < 5; ++i) {
    cout << arr[i];
}
cout << endl;

C\C++是我當年在大學時第一個學會的程式語言。但隨著時間的轉變,來到海外工作之後,就幾乎沒再碰過它了,之後比較常接觸的技術變成了AI和區塊鏈。平常用的語言也從C\C++轉換成Python和Javascript。

一開始我在給intern出面試題的時候都會以C\C++為主,因為絕大多數人學習的第一個語言都是C\C++;後來發現新人學習的第一個語言變成Java或是Python,就不在以C\C++為主要面試的語言了。

Leave a comment