2008年12月1日

Array initialization (陣列初始化) in C

UPDATE: 2010-06-18

最近在PTT的C_and_CPP版上問了一些關於C的array initialization問題,討論之後的整理筆記如下(以下用 gcc 4.3.4 + gdb 7.0 測試)

(1) array沒初始:初始值是垃圾值

int num[10];

char array[10];

(2a) array部份初始版本1(不是用大括弧):除了有被初始的以外,都是垃圾值

int num[10];
num[0] = 999; //num[0]以外都是垃圾值

char array[10];
array[0]='a'; //array[0]以外都是垃圾值

(2b) array部份初始版本2(用大括弧):沒初始的部份會自動補成0

int num[10] = {1,2,3};

int num[10] ={};

ps. char array[10] = ""; //也會自動補0,我是因為這相當於char array[10] = {'\0'};

會自動補0的原因如下:

(節錄自tinlans大,英文是C99的一段)
[...If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.
array 和 struct 這類東西在程式語言裡都被歸類為 aggregate (聚合資料)...]

粗略的總結就是:

如果aggregate型別(如array/struct)初始不完全,而且又是用大括弧方式初始,compiler就會像對static變數一樣,自動把沒初始到的補0

所以,我們可以用以下初始方式把array初值都設為0:

int num[10] = {0};

但是要觀念上要清楚,不要誤解成所有元素都會設成同樣的值,以下就是可能的誤用:

int num[10] = {255}; //這樣其實只有第一個是255,其他元素是會自動補0,不是全部都設成255。

以上如果有錯,請留下您的意見一起討論!

3 則留言:

DS0320 提到...

用 ArrayList... (羞)

Will Wang 提到...

一時興起發了這篇就被你瞄到XD

拍狼 提到...

google到前同學的文章還真奇妙丂丂