2021-05-12 14:32:11
C語言中sizeof()與strlen()的區別詳解
前言
sizeof()和strlen()經常會被初學者混淆,但其中有有很大區別:
sizeof()
1. sizeof()【運算元所佔空間的位元組數大小】是一種c中的基本運運算元。
可以以型別、指標、陣列和函數等作為引數。
標頭檔案型別為unsigned int。
運算值在編譯的時候就出結果,所以可以用來定義陣列維數。
char a[5]="123"; int b=sizeof(a);//b=5 int c=strlen(a);//c=3
sizeof()是一種單目操作符,是用來計算你所使用的運算元所佔的空間位元組大小。
strlen
2.strlen()[計算字串的長度]是一種函數。
' '作為終止符;
strlen的結果執行的時候才出來(不是編譯期求值),是計算字串長度的。
其引數必須是字元型指標(char*)。
標頭檔案為#include<string.h>
size_t strlen(const char *str)//size_t()
以下是一些具體的範例(vs2013 設定為32位元):
int main() { char *p = "hello"; char arr1 []= "hello"; char arr2[] = { 'h', 'e', 'l', 'l', 'o' }; printf("%dn", sizeof( p)); //結果4,因為指標變數的所佔空間大小僅僅和作業系統位數有關32-4,64-8 printf("%dn", sizeof(arr1)); //結果6,字串預設以 結尾,sizeof()包含 的計算 printf("%dn", sizeof(arr2)); //結果為5,因為為字元型表示,並不含有 (僅僅字串有 ) printf("%dn", strlen( p)); //結果為5,strlen求的是字串的長度,不包含 printf("%dn", strlen(arr1)); //結果為5,strlen求的是字串的長度,不包含 printf("%dn", strlen(arr2)); //因為字元型不包含 ,但字串需要找到 才可結束,所以在'o'之後繼續向後讀取直到找到 ,所以是一個隨機值
結果如上;
設定為32位元作業系統
後補一個注意事項:
#include <stdio.h> int main() { int arr[] = {1,2,(3,4),5};//整型陣列 printf("%dn", sizeof(arr)); return 0; }
注意陣列的資料型別,char只佔一個位元組,而int 資料型別四個位元組哦,別忘了*4。前面的例子是char的。
#include <stdio.h> int main() { char arr[] = {1,2,(3,4),5};//字元型 printf("%dn", sizeof(arr)); return 0; }
大量案例(想深入瞭解可以看)
2020年11月19日補充:
補充幾個題:
1.(花括號int的sizeof())
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int arr[] = { 1, 2, 3, 4 }; printf("%dn", sizeof(arr)); // 16 printf("%dn", sizeof(arr + 0)); // 4 求 sizeof(int*) printf("%dn", sizeof(*arr)); // 4, 求 sizeof(int) printf("%dn", sizeof(arr + 1)); // 4, 求 sizeof(int*) printf("%dn", sizeof(arr[1])); // 4, 求 sizeof(int) printf("%dn", sizeof(&arr));// 4, 求 sizeof(int(*)[4]); printf("%dn", sizeof(*&arr));// 16, 求 sizeof(int[4]); printf("%dn", sizeof(&*arr));// 4, 求 sizeof(int*) printf("%dn", sizeof(&arr + 1)); // 4, 求 sizeof(int(*)[4]) printf("%dn", sizeof(&arr[0])); // 4, 求 sizeof(int*) printf("%dn", sizeof(&arr[0] + 1)); // 4, 求 sizeof(int*) system("pause"); return 0; }
花括號定義不帶' ',所以求strlen就是未定義行為,所以就只有sizeof().
2.(花括號char的sizeof())
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; printf("%dn", sizeof(arr)); // 6, sizeof(char[6]) printf("%dn", sizeof(arr + 0)); // 4, sizeof(char*) printf("%dn", sizeof(*arr)); // 1, sizeof(char) printf("%dn", sizeof(arr + 1)); // 4 printf("%dn", sizeof(arr[1]));// 1, sizeof(char) printf("%dn", sizeof(&arr));// 4, sizeof(char(*)[6]) printf("%dn", sizeof(*&arr)); // 6, sizeof(char[6]) printf("%dn", sizeof(&*arr));// 4, sizeof(char*) printf("%dn", sizeof(&arr[1] + 1)); // 4, sizeof(char*) printf("%dn", sizeof(&arr + 1)); // 4, sizeof(char(*)[6]); system("pause"); return 0; }
花括號定義不帶' ',所以求strlen就是未定義行為,所以就只有sizeof().
3.(字串char的sizeof()和strlen)
char arr[] = "abcdef"; printf("%dn", sizeof(arr)); // 7, sizeof(char[7]); printf("%dn", sizeof(arr + 0)); // 4, sizeof(char*) printf("%dn", sizeof(*arr)); // 1, sizeof(char) printf("%dn", sizeof(arr[1])); // 1, sizeof(char) printf("%dn", sizeof(&arr[0] + 1)); // 4, sizeof(char*) printf("%dn", sizeof(&arr)); // 4 sizeof(char(*)[7]) printf("%dn", sizeof(*&arr)); // 7 sizeof(char[7]) printf("%dn", sizeof(&*arr)); // 4 sizeof(char*) printf("%dn", sizeof(&arr + 1)); // 4 sizeof(char(*)[7]) printf("%dn", strlen(arr)); // 6 printf("%dn", strlen(arr + 1)); // 5 printf("%dn", strlen(&arr + 1)); //型別不匹配 printf("%dn", strlen(&arr)); // 型別不匹配 printf("%dn", strlen(&arr[0])); // 6 printf("%dn", strlen(*&arr)); // 6 printf("%dn", strlen(&*arr)); // 6 printf("%dn", strlen(&arr[1] + 1));//4
strlen中型別不匹配是因為他們的資料型別不是char*.
4.(指標定義的sizeof()和strlen)
這個例題其實有點偏題了,涉及到指標和陣列的隱式轉化(感興趣的可以去看我的部落格–指標基礎總結詳解(裡面有指標和陣列的講解))
char* p = "abcdef"; printf("%dn", sizeof(p)); // 4 sizeof(char*) printf("%dn", sizeof(p + 1)); // 4 sizeof(char*) printf("%dn", sizeof(*p)); // 1 sizeof(char) printf("%dn", sizeof(p[0])); // 1 sizeof(char) printf("%dn", sizeof(&p)); // 4 sizeof(char**) printf("%dn", sizeof(&p[1] + 1)); // 4 sizeof(char*) printf("%dn", sizeof(*&p)); // 4 sizeof(char*) printf("%dn", sizeof(&*p)); // 4 sizeof(char*) printf("%dn", strlen(p)); // 6 printf("%dn", strlen(p + 1)); // 5 printf("%dn", strlen(*p)); // 型別不匹配 printf("%dn", strlen(p[1])); // 型別不匹配 printf("%dn", strlen(&p)); // 型別不匹配. printf("%dn", strlen(&p[1] + 1)); // 4 printf("%dn", strlen(*&p)); // 6 printf("%dn", strlen(&*p)); // 6
strlen中型別不匹配是因為他們的資料型別不是char*.
5.(花括號二維陣列int的sizeof())
int arr[3][4] = { 0 }; printf("%dn", sizeof(arr)); // 48 sizeof(int[3][4]) printf("%dn", sizeof(arr[0])); // 16 sizeof(int[4]) // arr[0] int[4], 再 + 1, 就把 int[4] 轉成 int* 了 printf("%dn", sizeof(arr[0] + 1)); // 4 sizeof(int*) printf("%dn", sizeof(&arr[0] + 1)); // 4 sizeof(int(*)[4]) printf("%dn", sizeof(arr[0][0])); // 4 sizeof(int) printf("%dn", sizeof(*arr[0])); // 4, sizeof(int) // arr 是二維陣列 int[3][4] => int(*)[4] => * => int[4] printf("%dn", sizeof(*arr)); // 16 sizeof(int[4]) // arr + 1 => int(*)[4] => * => int[4] printf("%dn", sizeof(*(arr + 1))); // 16 sizeof(int[4]) // arr => int[3][4] => int(*)[4] => * => int[4] => +1 => int* printf("%dn", sizeof(*arr + 1)); // 4 arr[0] => int[4] => & => int(*)[4] => +1 => int(*)[4] printf("%dn", sizeof(&arr[0] + 1)); // 4 sizeof(int(*)[4]) printf("%dn", sizeof(*(arr[0] + 1))); // 4 arr[0] => int[4] => +1 => int* => * => int
到此這篇關於C語言中sizeof()與strlen()區別的文章就介紹到這了,更多相關C語言sizeof()與strlen()區別內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章