一維陣列的初始化問題
阿新 • • 發佈:2019-02-11
參考了:
一. 陣列可以用一個初始列表值來初始化,如下所示:
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;
這個肯定成功。