sizeof與strlen的區別

時間 2021-08-11 17:23:45

1樓:我是一個麻瓜啊

1. strlen 是函式,sizeof 是運算子。

2. strlen 測量的是字元的實際長度,以'\0' 結束。而sizeof 測量的是字元的分配大小。

比如:char str[20] = "hello";

printf("strlen: %d\n", strlen(str));

printf("sizeof: %d\n", sizeof(str));

結果顯示為:

strlen: 5

sizeof: 20

3.但是在子函式中,size of 會把從主函式中傳進來的字元陣列當作是指標來處理。指標的大小又是由機器來決定,而不是人為的來決定的。

#include

void size_of(char str)

printf("sizeof:%d\n", sizeof(str));

int main()

char str[20] = "hello";

size_of(str);

return 0;

結果顯示為sizeof:4

4.我們知道字元陣列的初始化一次性賦值,也可以逐個賦值。可以指定陣列的大小,也可以不指定陣列長度。

#include

#include

int main()

char str1 = "hello";

char str2 = ;

char str3 = ;

printf("str1:%s\n",str1);

printf("str2:%s\n",str2);

printf("str3:%s\n",str3);

printf("str1:%d\n", strlen(str1));

printf("str2:%d\n", strlen(str2));

printf("str3:%d\n", strlen(str3));

return 0;

結果顯示為:

str1:hello

str2:hello

str3:hellohello

str1:5

str2:5

str3:10

5.strlen的結果要在執行的時候才能計算出來,是用來計算字串的長度,不是型別佔記憶體的大小。而大部分編譯程式在編譯的時候就把sizeof計算過了是型別或是變數的長度。

6.sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以''\0''結尾的。

2樓:匿名使用者

首先說明一點,char型別佔一個位元組,所以sizeof(char)是1,這點要理解

str1是一個指標,只是指向了字串"absde"而已。所以sizeof(str1)不是字串佔的空間也不是字元陣列佔的空間,而是一個字元型指標佔的空間。所以sizeof(str1)=sizeof(char*)=4,在c/c++中一個指標佔4個位元組

str2是一個字元型陣列。c/c++規定,對於一個陣列,返回這個陣列佔的總空間,所以sizeof(str2)取得的是字串"absde"佔的總空間。"absde"中,共有a b s d e \0六個字元,所以str2陣列的長度是6,所以sizeof(str2)=6*sizeof(char)=6

str3已經定義成了長度是8的陣列,所以sizeof(str3)為8

str4和str2類似,'0' '1' ... '9'加上'\0'共11個字元,所以ss佔的空間是8

總之,對於指標,sizeof操作符返回這個指標佔的空間,一般是4個位元組;而對於一個陣列,sizeof返回這個陣列所有元素佔的總空間。char*與char容易混淆,一定要分清,而且char*="aaa"的寫法現在不被提倡,應予以避免

而strlen不區分是陣列還是指標,就讀到\0為止返回長度。而且strlen是不把\0計入字串的長度的。

3樓:吉祥二進位制

strlen:是c標準庫中的字串函式,用於統計字元的個數。

sizeof:是c語言中的運算子,確切的說是一個編譯時運算子,用於統計型別或者變數所佔的記憶體位元組數。示例,以32位系統為例。

char *str = "hello";

strlen(str); //它的值是5,因為hello這個字串有5個字元

sizeof(str); //它的值是4,因為char *是一個指標型別,它佔4個位元組。

sizeof("hello"); //它的值是5,是因為hello有5個字元,每一個字元佔1個位元組。

int a[2] = ;

sizeof(a); //它的值是8,因為a中有2個int型變數,每個int型佔4個位元組,所以8位元組

4樓:買越晁曉燕

sizeof(str),其中str為字串的頭指標,指標佔的空間為4位元組,即為4

strlen(str),計算str的有效長度,hello長度為5,輸出為5;

sizeof(s),s是一個字串,此時,sizeof計算的是這個字串的長度,除了hello佔5個位元組以外,還有一個位元組的'\0'表示字串結束,總共為6;

希望樓主能明白

5樓:風凱定士原

sizeof和strlen沒有任何相似的地方。

strlen計算的是字串長度的函式,直到遇到'\0'結束,結果不包括'\0'在內。

sizeof是一個運算子,在編譯的時候就計算結果了,可以確定一個變數、型別、陣列佔用的記憶體空間。

6樓:管迪勵素華

sizeof可以是對於一個型別,如:int,short,char,或者一個結構,能夠得到它的位元組數,也能得到陣列的位元組數。還有sizeof不是一個函式

strlen是對於字串的,從第一個元素開始,直到遇到'\0'為止,如果你這麼寫是錯誤的

inta[3]=;

printf("%d",

strlen(a));

7樓:匿名使用者

1. sizeof 操作符的結果型別size_t,它在標頭檔案中typedef為unsigned int型別: typedef unsigned int size_t.

2. sizeof是是長度運算子, 獲得資料型別或是變數的長度,如果是資料型別,則返回資料型別大小,如果是用陣列,則返回陣列所佔空間大小,strlen是計算字串長度的函式,返回的是實際串長度,以char* 作引數 ,且必須是以'\0'結尾。3.

sizeof在編譯的時候就把計算過,strlen的結果要在執行的時候才能計算出來。4. 陣列做長度運算子sizeof的引數不退化。

陣列做函式strlen的引數就退化為指標了,因為陣列作為引數傳給函式時傳的是指標而不是陣列,傳遞的是陣列的首地址。

8樓:鐵芹藩凌青

sizeof()求的是位元組數,不同型別的資料在記憶體中的位元組數是不一樣的,對於字串來說,也就是字元的個數,因為一個字元佔1個位元組的記憶體,當然這裡包括字串最後的'\0'字元。

而strlen()求的是字串的長度,也就是字元的個數,不包括最後的'\0'字元

9樓:匿名使用者

strlen,是判斷字串的長度,即:string length,在這裡是good的長度,長度是4.

sizeof,是判斷型別的長度,在這裡是陣列的長度,在這裡是str資料的長度,長度是10。

10樓:匿名使用者

首先要對字串要了解。字串最後有個隱藏的字元'\0',標識該字串結束。

'\n'是換行符號,只是一個字元而已。

sizeof 計算字串長度時候會把最後的 '\0' 算進去,而strlen 不會。

所以一般結果就是 sizeof 計算出來的長度 比 strlen的長度要多1個位元組。

例如:這個sizeof("hello")=6,而strlen("hello")=5。

但是sizeof 在計算陣列的時候,是計算這個陣列的最大長度,而不是陣列內部資料的長度。

所以問題中的 strlen結果是5,而sizeof結果是10 。'\n'也佔一個位元組。

除此之外,還要注意,當sizeof後面帶一個指標的時候,實際上是計算指標的長度,一般32位裝置

指標長度是4個位元組。而strlen依然是計算指標指向的長度。

例如:char *a="hello";

sizeof(a)=4 <=-====因為a是指標,結果是指標的大小

strlen(a)=5 <*****=依然是5

11樓:匿名使用者

我們能常在用到 sizeof 和 strlen 的時候,通常是計算字串陣列的長度

從這個例子可以看得很清楚:har str[11]="0123456789";//注意這裡str大小因該大於等於11,應考慮'\0'在內,否則編譯器會報錯

int a=strlen(str); //a=10; >>>> strlen 計算字串的長度,以結束符 0x00 為字串結束。

int b=sizeof(str); //而b=11; >>>> sizeof 計算的則是分配的陣列 str[11] 所佔的記憶體空間的大小,不受裡面儲存的內容改變。

12樓:上天

一、sizeof

sizeof(...)是運算子,在標頭檔案中typedef為unsigned int,其值在編譯時即計算好了,引數可以是陣列、指標、型別、物件、函式等。

它的功能是:獲得保證能容納實現所建立的最大物件的位元組大小。

由於在編譯時計算,因此sizeof不能用來返回動態分配的記憶體空間的大小。實際上,用sizeof來返回型別以及靜態分配的物件、結構或陣列所佔的空間,返回值跟物件、結構、陣列所儲存的內容沒有關係。

二、strlen

strlen(...)是函式,要在執行時才能計算。引數必須是字元型指標(char*)。當陣列名作為引數傳入時,實際上陣列就退化成指標了。

它的功能是:返回字串的長度。該字串可能是自己定義的,也可能是記憶體中隨機的,該函式實際完成的功能是從代表該字串的第一個地址開始遍歷,直到遇到結束符null。

返回的長度大小不包括null。

【擴充套件資料】:

1、具體而言,當引數分別如下時,sizeof返回的值表示的含義如下:

陣列——編譯時分配的陣列空間大小;

指標——儲存該指標所用的空間大小(儲存該指標的地址的長度,是長整型,應該為4);

型別——該型別所佔的空間大小;

物件——物件的實際佔用空間大小;

函式——函式的返回型別所佔的空間大小。函式的返回型別不能是void。

2、舉例:

(1)、char arr[10] = "what?";

int len_one = strlen(arr);

int len_two = sizeof(arr);

cout << len_one << " and " << len_two << endl;

輸出結果為:5 and 10

點評:sizeof返回定義arr陣列時,編譯器為其分配的陣列空間大小,不關心裡面存了多少資料。strlen只關心儲存的資料內容,不關心空間的大小和型別。

(2)、char * parr = new char[10];

int len_one = strlen(parr);

int len_two = sizeof(parr);

int len_three = sizeof(*parr);

cout << len_one << " and " << len_two << " and " << len_three << endl;

輸出結果:23 and 4 and 1

點評:第一個輸出結果23實際上每次執行可能不一樣,這取決於parr裡面存了什麼(從parr[0]開始知道遇到第一個null結束);第二個結果實際上本意是想計算parr所指向的動態記憶體空間的大小,但是事與願違,sizeof認為parr是個字元指標,因此返回的是該指標所佔的空間(指標的儲存用的是長整型,所以為4);第三個結果,由於*parr所代表的是parr所指的地址空間存放的字元,所以長度為1。

【參考資料】:

1.sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。

該型別保證能容納實現所建立的最大物件的位元組大小。

2.sizeof是算符,strlen是函式。

3.sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以''\0''結尾的。

sizeof還可以用函式做引數,比如:

short f();

printf("%d\n", sizeof(f()));

輸出的結果是sizeof(short),即2。

4.陣列做sizeof的引數不退化,傳遞給strlen就退化為指標了。

c語言中strlen與sizeof有什麼區別

strlen 是返回所定義字串的長度,而sizeof是用來取得變數或型別所占用的記憶體空間大小的。 strlen 是返回字串的長度。而sizeof,卻是用來取得變數或型別所占用的記憶體大小的。這個a陣列的字串長度為4 末尾的 0是不計入字串長度的 但a是10個單位的char型,它占用的記憶體空間是1...

strlen和sizeof有什麼區別

妖精王的祝福 區別 一 定義不同 sizeof是運算子,在標頭檔案中typedef為unsigned int,其值在編譯時即計算好了,引數可以是陣列 指標 型別 物件 函式等。2 它的功能是 獲得保證能容納實現所建立的最大物件的位元組大小。具體而言,當引數分別如下時,sizeof返回的值表示的含義如...

c語言中sizeof 和strlen 用法上有什麼區別呢

延霞月 兩者都是返回位元組數,具體講前者返回的是位元組數,而後者返回的是字元數 其次,sizeof返回的數量包括最後的結束符 0 而strlen則沒有。 sizeof是操作符,不是函式。它後面的 並不是必須的,沒有歧意時就不必寫上了。sizeof操作符計算的是系統為它後面的變數或型別名分配的空間大小...