文章目錄
- 含義
- 示例一
- 示例二
- 說明
- 代碼三
- 代碼四
- 總結
關于 strlen 與 sizeof 的區別,我相信很多人都有所了解
以下我深度決議一下strlen 與 sizeof的區別和注意事項
含義
sizeof()是運算子,在頭檔案的型別為unsigned int,其運算值在編譯時就計算好了,引數可以是指標、陣列、型別、物件和函式等;
strlen()是函式,要在運行時才能計算,引數必須是字符型指標(char*),當陣列名作為引數傳入時,實際上陣列就退化為指標了,該函式完成的功能是從代表該字串的第一個地址開始遍歷的,直到遇到結束符NULL,回傳的長度大小不包括NULL,
示例一
#include <stdio.h>
#include <string.h> //strlen要引頭檔案
int main()
{
char str[20] = "hello";
printf("strlen=%d\n", strlen(str));
printf("sizeof=%d\n", sizeof(str));
return 0;
}
結果顯示為:
strlen = 5
sizeof = 20
這時的 strlen=5,sizeof=20
因為strlen計算的是字串的長度,以\0為字串結束標志;
而sizeof計算的是分配的陣列str[20]所占的記憶體空間的大小,不受里面存盤的內容影響,
示例二
#include <stdio.h>
int main()
{
char *str1 = "abcde";
char str2[] = "abcde";
char str3[8] = {'a'};
char str4[] = "0123456789";
printf("sizeof(str1)=%d\n", sizeof(*str1));
printf("sizeof(str2)=%d\n", sizeof(str2));
printf("sizeof(str3)=%d\n", sizeof(str3));
printf("sizeof(str4)=%d\n", sizeof(str4));
return 0;
}
結果顯示為:
sizeof(str1) = 4
sizeof(str2) = 6
sizeof(str3) = 8
sizeof(str4) = 11
str1是一個指標,只是指向了字串"abcde"而已,所以sizeof(*str1)不是字串占的空間,也不是字符陣列占的空間,而是一個指標所占的空間,在C/C++中一個指標占四個位元組,
str2是一個字符型陣列,對于一個陣列,回傳這個陣列所占的總空間,所以sizeof(str2)取得的是字串"abcde"的總空間,"abcde"中,共有a b c d e \0六個字符,所以str2陣列的長度時6,·
str3已經定義成了長度為8的陣列,所以sizeof(str3)為8;
str4和str2類似,共十一個字符,所以str4所占的空間是11.
說明
示例二里面列舉了一個指標,如果你驗證我的代碼的話,可能會是sizeof(str1) = 8
那是因為32位機器上指標大小是4個位元組,64位機器上是8個位元組
因為32位機器的尋址地址空間是4G,每個地址是32位,恰好是4個位元組,即指標大小是4個位元組,
而64位機器的每個地址是64位,是8個位元組,因此指標是8個位元組,
代碼三
子函式中,ziseof 會把從主函式中傳進來的字符陣列當作是指標來處理,
指標的大小又是由機器來決定,而不是人為的來決定的,
void size_of(char str[])
{
printf("sizeof = %d\n", sizeof(str));
}
int main()
{
char str[20] = "hello";
size_of(str);
return 0;
}
結果顯示為:
sizeof = 4
具體而言,當引數分別是如下時,sizeof回傳的值表示的含義如下:
陣列:編譯時分配的陣列空間的大小;
指標:存盤該指標所用的空間的大小(存盤該指標的地址的長度,是長整型,應該是4);
型別:該型別所占的空間的大小;
物件:物件的實際占用空間大小;
函式:函式的回傳型別所占的空間大小,函式的回傳型別不能是void,
代碼四
#include <stdio.h>
#include <string.h>
int main()
{
char *str = "0123456789";
printf("sizeof(str) = %d\n", sizeof(str));
printf("sizeof(*str) = %d\n", sizeof(*str));
printf("strlen(str) = %d\n", strlen(str));
return 0;
}
結果顯示為:
sizeof(str) = 4
sizeof(*str) = 1
strlen(str) = 10
sizeof(str): str是指向是字串常量的字符指標,sizeof獲得的是第一個指標所占的空間,應該是長整型,所以是4;
sizeof(*str): *str是第一個字符,其實就是獲得了字串的第一位’0’多占的記憶體空間,是char型別的,占了1位
sizeof(str):如果要獲得這個字串的長度,則一定要用strlen
總結
sizeof 是運算子,測量的是字符的分配大小
strlen是函式,測量的是字符的實際長度,以\0結束,所以只要strlen碰到\0就結束
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/342076.html
標籤:其他
下一篇:c語言中的比較大小問題
