一般寫C\C++的best practice要在variable初始化時給予初值,避免程式的執行不如預期,另一方面也可以增加可讀性。array的初始化也一樣要給予初值。但是array的初始化方法比較多,我們在這篇文章中給大家講解。
不給予初值的後果
當一般的local variable沒有給初值的話,不同的compiler會有不同的behavior。以VS 2013為例,使用沒給初值的local variable會產生以下error message:
但是如果是使用沒給初值的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++為主要面試的語言了。