C語言中,當計算字元陣列長度時,用sizeof 和strlen 的原理及兩者的區別
字元陣列的長度計算:必須以終止符’\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''結尾的。
相關文章
- 求陣列長度的兩種方法,以及區別(strlen sizeof)陣列
- sizeof 和 strlen 計算陣列大小和長度詳解陣列
- c語言的strlen函式計算字元陣列長度不對C語言函式字元陣列
- c語言中計算陣列長度的方法C語言陣列
- sizeof和strlen計算陣列型別和指標型別字串陣列型別指標字串
- sizeof與strlen的區別
- C語言如何計算陣列的長度C語言陣列
- 解析C語言中的sizeofC語言
- c語言中陣列的宣告喝初始化的區別和聯絡C語言陣列
- c語言中陣列的三種型別C語言陣列型別
- c語言中二維陣列的生成及應用C語言陣列
- 字元陣列的長度字元陣列
- C語言中陣列首地址和陣列第一個元素的地址有什麼區別C語言陣列
- c語言中sizeof詳解C語言
- go 語言中的 rune,獲取字元長度Go字元
- 獲取C/C++字串、字元陣列長度C++字串字元陣列
- c語言中實現4行3列矩陣和3行4列矩陣的運算C語言矩陣
- 詳解資料結構中的“陣列”與程式語言中的“陣列”的區別和聯絡資料結構陣列
- C語言中pi=&j和*pi=j的區別C語言
- c語言中作用域和儲存期的區別C語言
- c語言字元陣列C語言字元陣列
- c語言中三維陣列C語言陣列
- GO語言中string和[]byte的區別及轉換Go
- python語言中類和函式的作用及區別!Python函式
- c語言中陣列的宣告與初始化C語言陣列
- C語言中“陣列名”和“&陣列名”C語言陣列
- c語言獲取陣列長度的函式C語言陣列函式
- c語言中返回整數值的長度C語言
- C語言sizeof()變數、字元、字串C語言變數字元字串
- C語言中Pointer, Array,String and Structures的區別C語言Struct
- 認識 Go 語言中的陣列Go陣列
- C++獲取陣列的長度C++陣列
- C語言中的#和##C語言
- C++陣列長度C++陣列
- c語言中預設引數的兩種型別C語言型別
- C語言中陣列溢位是什麼C語言陣列
- 《細說PHP》中strlen和mb_strlen的區別PHP
- c語言中文和ascii碼字元分離C語言ASCII字元
- C#陣列與集合的區別C#陣列