sizeof是乙個關鍵字不是函式,發生在編譯時刻。
sizeof是c/c++中的乙個運算子,其作用是返回乙個物件或者型別在記憶體中所占用的位元組數。
注意:sizeof後面如果是型別則必須加括號,如 sizeof(char);而如果是變數名則可以不加括號,如 sizeof a; 但是建議使用時 均加上括號。sizeof不能返回動態地被分配的陣列的大小。
總結如下,當引數分別如下時,sizeof返回的值表示的含義如下:
陣列——編譯時分配的陣列空間大小;
指標——儲存該指標所用的空間大小(在32位系統是4,在64系統是8);
型別——該型別所佔的空間大小;
物件——物件的實際占用空間大小;
函式——函式的返回型別所佔的空間大小。函式的返回型別不能是void
strlen是c語言中的庫函式,發生在執行時刻,所在標頭檔案為#include 其函式原型為unsigned int strlen(char *s);
其中s為指定的字串。
注意:strlen只能用char *作為引數,它求的是字串的實際長度,方法是從開始到遇到第乙個'\0'結束。
sizeof只關心這塊記憶體的大小,不關心這塊記憶體存放了什麼資料,
strlen只關心這塊記憶體存放的資料,不關心這塊記憶體的大小,直到遇到第乙個null為止。
二、幾個例子
例1:char str[20] = "0123456789";
int a = strlen(str); /*a = 10*/
int b = sizeof(str);/*b = 20*/
上面結果為a = 10,這是因為strlen計算的是字串的實際長度,以第乙個'\0'為結束符;
b = 20,這是因為sizeof計算的是分配的陣列str[20]所佔的空間大小,不受裡面儲存內容的影響。
例2:char *ss = "0123456789";
int i = sizeof(ss); /*i = 4*/
int j = sizeof(*ss); /*j = 1*/
int k = strlen(ss); /*k = 10*/
上面結果為i = 4,這是因為sizeof獲得的是乙個指標的值所佔的位址空間,為long int型的,佔4個位元組;
j = 1,這是因為 *ss 為第乙個字元 '0' 所以佔乙個位元組;
k = 10,這是因為strlen所獲得的是此字串的實際長度,所以要想獲得此字串的長度,則一定要用strlen
例3:char buffer = "hello";
int m = strlen(buffer); /*m = 5*/
int n = sizeof(buffer); /*n = 6*/
上面結果為m = 5,這是因為strlen測量的是字串的實際長度,以遇到的第乙個'\0'為結束標誌;
n = 6,這是因為字串以'\0'為結束標誌,'\0'也需要占用乙個位元組,所以sizeof測得的結果為6。
最後的sizeof計算的是指標(sizeof(char *)) 的大小,為4。
char* s = "0123456789";
sizeof(s); //結果 4 ===》s是指向字串常量的字元指標
sizeof(*s); //結果 1 ===》*s是第乙個字元
strlen(s); //結果 10 ===》有10個字元,strlen是個函式內部實現是用乙個迴圈計算到\0為止之前
strlen(*s); //結果 10 ===》錯誤
char s = "0123456789";
sizeof(s); //結果 11 ===》s是陣列,計算到\0位置,因此是10+1
strlen(s); //結果 10 ===》有10個字元,strlen是個函式內部實現是用乙個迴圈計算到\0為止之前
sizeof(*s); //結果 1 ===》*s是第乙個字元
char s[100] = "0123456789";
sizeof(s); //結果是100 ===》s表示在記憶體中的大小 100×1
strlen(s); //結果是10 ===》strlen是個函式內部實現是用乙個迴圈計算到\0為止之前
int s[100] = "0123456789";
sizeof(s); //結果 400 ===》s表示再記憶體中的大小 100×4
strlen(s); //錯誤 ===》strlen的引數只能是char* 且必須是以『\0『結尾的
char q="abc";
char p="a\n";
sizeof(q), sizeof(p), strlen(q), strlen(p); \\結果是 4 3 3 2
char p = ;
char q = ;
sizeof(p); //結果是8 ===》p表示在記憶體中的大小 8×1
strlen(p); //為乙個隨機值,結果與編譯器有關,不同編譯器結果一般不同
sizeof(q); //結果是8 ===》p表示在記憶體中的大小 8×1
strlen(q); //結果為4 ===》存在'\0',遇到'\0'計算停止。
sizeof求位元組以及與strlen的區別
例子一 根據以下條件進行計算 1 結構體的大小等於結構體內最大成員大小的整數倍 2 結構體內的成員的首位址相對於結構體首位址的偏移量是其型別大小的整數倍,比如說double型成員相對於結構體的首位址的位址 偏移量應該是8的倍數。include include using namespace std ...
C語言中的strlen與sizeof的區別
sizeof與strlen是有著本質的區別,sizeof是求資料型別所佔的空間大小,而strlen是求字串的長度,字串以 0結尾。區別如下 1 sizeof是乙個c語言中的乙個單目運算子,而strlen是乙個函式,用來計算字串的長度。2 sizeof求的是資料型別所佔空間的大小,而strlen是求字...
C語言中的strlen與sizeof的區別
sizeof與strlen是有著本質的區別,sizeof是求資料型別所佔的空間大小,而strlen是求字串的長度,字串以 0結尾。區別如下 1 sizeof是乙個c語言中的乙個單目運算子,而strlen是乙個函式,用來計算字串的長度。2 sizeof求的是資料型別所佔空間的大小,而strlen是求字...