1. 程式人生 > >C語言不定長陣列及初始化

C語言不定長陣列及初始化

C語言不支援不定長陣列,要麼malloc,要麼在動態的指定它的長度

動態陣列不能初始化,可使用memset

1.int* p = (int*)malloc(num);

2.int num = 5;

   arr[num];

若使用arr[],則需要在後面對齊進行初始化,來指定長度,否則編譯可以通過,但是預設只有一個單元,超過一個單元的長度,在後面程式的執行中有可能會被沖掉

int arr[] = {0};//定義了一個單元的陣列,並不是不定長陣列

最好不用使用arr[] = {0}來定義陣列,定義陣列之前應要指定長度

int arr[256] = {0};

int a[256]={0};並不是把a的所有元素初始化為0,int a[256]={1};也不是把a所有的元素初始化為1.

陣列可以用一個列值來初始化,例如
         int v1[] ={1,2,3,4};
         char v2[]={'a','b','c',0};
當陣列定義時沒有指定大小,當初始化採用列表初始化了,那麼陣列的大小由初始化時列表元素個數決定。所以v1和v2分別為 int[4] 和char[4]型別。如果明確指定了陣列大小,當在初始化時指定的元素個數超過這個大小就會產生錯誤。例如:
         char   v3[2] ={'a','b',0};   //錯誤:太多的初始化值了
         char   v3[3] ={'a','b',0};   //正確

如果初始化時指定的的元素個數比陣列大小少,剩下的元素都回被初始化為   0。例如
         int   v5[8]={1,2,3,4};
等價於
          int   v5[8]={1,2,3,4,0,0,0,0};

注意沒有如下形式的陣列賦值:
         void f()
         {
             v4={'c','d',0};   //錯誤:不是陣列賦值
         }


顧名思義,集合(aggregate)就是多個事物聚集在一起,這個定義包括混合型別的集合:像struct和class等,陣列就是單一型別的集合。
初始化集合往往既冗長又容易出錯,而C++中集合初始化(aggregate   initialization)卻變得很方便而且很安全。當產生一個集合物件時,要做的只是指定初始值就行了,然後初始化工作就由編譯器去承擔了。這種指定可以用幾種不同的風格,它取決於正在處理的集合型別。但不管是哪種情況,指定的初值都要用大括號括起來。比如一個內部型別的陣列可以這樣定義:
int   a[5]   =   {   1,   2,   3,   4,   5   };
如果給出的初始化值多於陣列元素的個數,編譯器就會給出一條出錯資訊。但如果給的初始化少於資料元素的個數,那將會怎麼樣呢?例如:
int   b[6]   =   {0};
這時,編譯器會把第一個初始化值賦給陣列的第一個元素,然後用0賦給其餘的元素。注意,如果定義了一個數組而沒有給出一列初始值時,編譯器並不會去做初始化工作。所以上面的表示式是將一個數組初始化為零的簡潔方法,