2011年06月09日 09:19:00 h_h_w_ 閱讀數:55390 標籤: 語言 c 編譯器 百度
字符數組的長度計算:必須以終止符’\0'作爲邊界,但對字符數組賦值時,有兩種方式:
1: 定義時用字符初始化
(1)char chs[7] = {'a', 'c', '0', 'z', '3','d'}; // 長度爲6
上式等價於: (2)char chs[7] = {'a', 'c', '0', 'z', '3','d', '/0'}; // 長度爲6
也等價於: (3)char chs[] = {'a', 'c', '0', 'z', '3','d', '/0' }; // 長度爲6
但不等價於: (4)char chs[] = {'a', 'c', '0', 'z', '3','d'}; // 長度未知,因爲數組最後沒有結束符'/0'
也不等價於: (5)char chs[6] = {'a', 'c', '0', 'z', '3','d'}// 長度未知,因爲數組最後沒有結束符'/0'
其中 :(4)和(5)也是等價的,但不應該在實際應用中出現,因爲沒有結束符的數組長度未知,容易出現數組越界,致使訪問非法內存,造成不可預料的程序錯誤。
因爲字符數組是C 語言的概念,可見,C 語言語法中並未保證 :字符數組的結尾一定有結束符,這就需要程序員自己採取措施,以保證在數組的最後一個元素爲 '/0' 。
2: 用字符串對數組進行初始化
在C語言中沒有專門的字符串變量,通常用一個字符數組來存放一個字符串。字符串總是以'/0'作爲串的結束符。因此當把一個字符串存入一個數組時,也把結束符'/0'存入數組,並以此作爲該字符串是否結束的標誌。有了'/0'標誌後,就不必再用字符數組的長度來判斷字符串的長度了。
C語言允許用字符串的方式對數組作初始化賦值。
例如:
char c[]={'c', ' ','p','r','o','g','r','a','m'};
可寫爲:
char c[]={"C program"};
或去掉{}寫爲:
char c[]="C program";
用字符串方式賦值比用字符逐個賦值要多佔一個字節, 用於存放字符串結束標誌'/0'。上面的數組c在內存中的實際存放情況爲:
C p r o g r a m /0
‘/0'是由C編譯系統自動加上的。由於採用了‘/0'標誌,所以在用字符串賦初值時一般無須指定數組的長度, 而由系統自行處理。
The following code fragment prints out 4. (2分)
char c[] = "I\t\r\\\0will\n";
printf("%d", strlen(c));
3. sizeof 和 strlen 的區別
strlen只能用char*做參數,且該char數組必須是以''/0''結尾的。
數組做sizeof的參數不退化,傳遞給strlen就退化爲指針了。
詳細說明可參見: 百度知道: strlen和sizeof有什麼區別?
http://zhidao.baidu.com/question/12033577.html
注意:大部分編譯程序 在編譯的時候就把sizeof計算過了 是類型或是變量的長度這就是sizeof(x)可以用來定義數組維數的原因 。
所以,sizeof 即使在字符數組沒有終止符'/0' 的時候,也能夠計算出數組“長度”的原因,但這裏的“長度”實際上是:編譯器分配給該數組變量的內存大小!
例如:char chs[] = {'a', 'c', '/0', 'z', '3','d'}; // sizeof(chs) = 6; 而strlen(chs) = 2.