sizeof 和 strlen 計算陣列大小和長度詳解
sizeof
首先 sizeof 並非為一個函式,而是C語言中的一個關鍵字。
sizeof 計算物件所佔記憶體的大小,也就是空間大小,它不存在 ‘\0’,也不會去找’\0’,所以不受其影響, 判斷運算元的型別長度,以位元組為單位;
指標在32位系統佔4個位元組,在64位系統佔8個位元組,本例項都在32位機器上操作。
sizeof 求大小看的僅僅是它的型別大小,而非其他。所以我們在計算時只要認清楚它的型別大小就行。
arr 和 &arr 的區別.
int arr[10] = { 0 );
arr -> 本意為陣列arr 的第一個元素的地址,但是在 sizeof (arr) 中被特殊化為求整個陣列 arr 的大小(這是一個特例),所以 sizeof (arr) = 40;
&arr -> 意思為整個陣列的記憶體地址,所以 sizeof (&arr) = 4;(因為它是一個陣列指標)
arr + 1 和 &arr + 1 的區別
arr 為首元素的地址 *,arr + 1 -> 即加了一個int * (4)的大小.
&arr 為陣列的地址, 陣列的地址 + 1 -> 即跳過了整個陣列的大小,所以相當於加了 40;
<1>
char arr[] = { 'a', 'b', 'c', 'd' };
1. printf("%d\n", sizeof(arr)); //4
2. printf("%d\n", sizeof(arr + 0)); //4
3. printf("%d\n", sizeof(*arr)); //1
4. printf("%d\n", sizeof(arr + 1)); //4
5. printf("%d\n", sizeof(arr[1])); //1
6. printf("%d\n", sizeof(&arr)); //4
7. printf("%d\n", sizeof(*&arr)); //4
8. printf("%d\n", sizeof(&arr + 1)); //4
9. printf("%d\n", sizeof(&arr[0])); //4
10. printf("%d\n", sizeof(&arr[0] + 1)); //4
- 整個陣列的大小(特例)= 4
- 陣列首元素的地址,型別為 char* = 4
- 陣列首元素,型別為 char = 1
- 陣列第二個元素的地址, 型別為 char* = 4
- 同3
- 陣列的地址,型別為char (*) [4] = 4
- 先求陣列地址,在解應用,相當於求陣列大小,同1
- 取陣列地址再 + 1 ,相當於跳過整個陣列,型別為 char (*)[4] = 4
- 陣列首元素的地址, 型別為 char * = 4
- 陣列第二個元素的地址,型別為 char * = 4
<2>
char arr[] = "abcd";
printf("%d\n", sizeof(arr)); //5
printf("%d\n", sizeof(*&arr)); //5
別忘了這種初始化模式系統會預設給末尾補一個 ‘\0’,所以是5, 其他的和<1> 是一樣的。
strlen
strlen 是庫函式,使用時須引用其標頭檔案 <string.h>
它存在 ‘\0’,會去找’\0’,所以會受到 '\0’的影響
它的格式為 size_t strlen(const char * str); (必須傳 const char * 型別的指標)
<1>
char arr[] = { 'a', 'b', 'c', 'd' };
char arr[] = { 'a', 'b', 'c', 'd', '\0' }; //自己新增 '\0'
1. printf("%d\n", strlen(arr)); // 隨機值
2. printf("%d\n", strlen(arr + 0)); //隨機值
3. printf("%d\n", strlen(*arr)); //型別不匹配
4. printf("%d\n", strlen(arr[1])); //型別不匹配
5. printf("%d\n", strlen(&arr)); //型別不匹配
6. printf("%d\n", strlen(&arr + 1)); //型別不匹配
7. printf("%d\n", strlen(&arr[0] + 1)); //隨機值
出現隨機值的原因是這樣定義的陣列後面沒有 ‘\0’,,所以 strlen 不能精確判斷結束條件,有可能在超出陣列很多後才停止。要想避免上述情況,建議用下面的方式進行初始化,或者自己在字元末尾加上 ‘\0’, 加上後的效果和 <2> 是一樣的.
<2>
char arr[] = "abcd";
1. printf("%d\n", strlen(arr)); // 4
2. printf("%d\n", strlen(arr + 0)); //4
3. printf("%d\n", strlen(*arr)); //型別不匹配
4. printf("%d\n", strlen(arr[1])); //型別不匹配
5. printf("%d\n", strlen(&arr)); //型別不匹配
6. printf("%d\n", strlen(&arr + 1)); //型別不匹配
7. printf("%d\n", strlen(&arr[0] + 1)); // 3
這種定義方式系統會自動在字串的末尾位置新增 ‘\0’,所以不會出現隨機值的問題。
相關文章
- sizeof和strlen計算陣列型別和指標型別字串陣列型別指標字串
- C語言中,當計算字元陣列長度時,用sizeof 和strlen 的原理及兩者的區別C語言字元陣列
- 求陣列長度的兩種方法,以及區別(strlen sizeof)陣列
- c語言陣列、sizeof()及strlen()C語言陣列
- c語言的strlen函式計算字元陣列長度不對C語言函式字元陣列
- C/C++——sizeof和strlen的區別C++
- c語言中計算陣列長度的方法C語言陣列
- C語言如何計算陣列的長度C語言陣列
- C語言中strlen求字串長度,求字元陣列長度(空字元,數字0,字元0,陣列部分初始化)C語言字串字元陣列
- 1588 所有奇數長度子陣列的和(字首和)陣列
- PHP陣列學習之計算陣列元素總和PHP陣列
- sizeof與strlen的區別
- sizeof 與 strlen 的區別
- strlen與sizeof的區別
- 磁碟陣列可靠度的計算陣列
- C++ 獲取陣列大小、多維陣列操作詳解C++陣列
- MyBatis陣列與集合判斷非空和長度MyBatis陣列
- Golang切片和陣列底層詳解Golang陣列
- javascript如何獲取陣列的長度和遍歷陣列的每一項JavaScript陣列
- Java 陣列的不同定義方式和陣列長度為可變引數Java陣列
- Kotlin 控制流和陣列操作詳解Kotlin陣列
- 65.C指標---sizeof()函式和strlen()函式常見考指標函式
- C++陣列長度C++陣列
- 字元陣列的長度字元陣列
- Java break、continue 詳解與陣列深入解析:單維陣列和多維陣列詳細教程Java陣列
- python numpy基礎 陣列和向量計算Python陣列
- 【譯】在 JavaScript 中建立和填充任意長度的陣列JavaScript陣列
- C指標和陣列的關係詳解指標陣列
- C++ Break、Continue 和 陣列操作詳解C++陣列
- C語言核心之陣列和指標詳解C語言陣列指標
- 索引高度和索引段大小計算索引
- Java 定義長度為 0 的陣列 / 空陣列Java陣列
- C語言中的strlen與sizeof的區別C語言
- 笨辦法學C 練習8:大小和陣列陣列
- lLeeCode最優題解收錄:1588.所有奇數長度子陣列的和陣列
- Javascript陣列詳解JavaScript陣列
- 矩陣和陣列矩陣陣列
- c語言中sizeof詳解C語言