C語言中,當計算字元陣列長度時,用sizeof 和strlen 的原理及兩者的區別

h_h_w_發表於2011-06-09

 

字元陣列的長度計算:必須以終止符’\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'標誌,所以在用字串賦初值時一般無須指定陣列的長度, 而由系統自行處理。

 

 

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. 

 

 

 

 

 

 

相關文章