1. 程式人生 > >一維陣列的初始化問題

一維陣列的初始化問題

參考了:

一. 陣列可以用一個初始列表值來初始化,如下所示:

int array1[] = {1, 5, 8, 9};
char array2[] = {'a', 'c', 'f', 'd', 'a'};

1. 當陣列定義時沒有指定大小,初始化時使用列表值來初始化了,如上所示,則陣列大小由初始化時列表元素個數決定,所以array1大小為4,array2大小為5;

2. 如果明確指定了大小,在初始化時,列表的元素個數超過了已指定的大小則會產生錯誤,如:

char array[2] ={'a','b',0};   //錯誤:太多的初始化值了
char array[3] ={'a','b',0};   //正確

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

4. 字元陣列可以方便的用字串進行初始化,例如:
char string[] = "abcdefghijklmn";

二. 使用memset初始化陣列

先看看memset的函式說明:

MEMSET(3)                BSD Library Functions Manual                MEMSET(3)

NAME
     memset -- fill a byte string with a byte value

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <string.h>

     void *
     memset(void *b, int c, size_t len);

DESCRIPTION
     The memset() function writes len bytes of value c (converted to an unsigned char) to the byte string b.

RETURN VALUES
     The memset() function returns its first argument.

SEE ALSO
     bzero(3), memset_pattern(3), swab(3), wmemset(3)

STANDARDS
     The memset() function conforms to ISO/IEC 9899:1990 (``ISO C90'').

memset通常用來對一段記憶體空間全部設定為某個字元,一般情況下用於對定義的字串進行初始化為 ' ' 或者 ’\0';例如
char array[100];
memset(array, '\0', sizeof(array));

也可這樣初始化一個整型陣列為0:

int array[10]; 
memset(array, 0, sizeof(array));

但是,看下面的例子:
int array[10]; 
memset(array, 1, sizeof(array));

是否array中所有的值都為1呢?

答案:不為1,而都是16843009,這是為何呢?

從上面的memset函式說明可以看出,memset的初始化是按位元組進行的,在進行memset(array, 1, sizeof(array));呼叫時,就是對array執行的sizeof(array)個位元組進行賦值,每個位元組都用ASCII為1的字元去填充,轉為二進位制後,1就是 00000001,佔一個位元組,一個 int 型別佔4個位元組,合起來就是 1 00000001 00000001 00000001,即16843009.就完成了對一個int型別的賦值,所以上面陣列中的值都為16843009.

三. 用迴圈初始化陣列

例如:

int array[10];
for(int i = 0; i < 10; ++ i)
        array[i] = 0;

這個肯定成功。