sizeof和strlen的區別

2022-04-06 01:07:51 字數 1677 閱讀 8677

一、sizeof

sizeof(...)是運算子,而不是乙個函式。

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

int,其值在編譯時即計算好了,引數可以是陣列、指標、型別、物件、函式等。

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

由於在編譯時計算,因此sizeof不能用來返回動態分配的記憶體空間的大小。

實際上,用sizeof來返回型別以及靜態分配的物件、結構或陣列所佔的空間,返回值跟物件、結構、陣列所儲存的內容沒有關係。

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

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

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

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

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

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

例子:char *str1="absde";

char str2="absde";

char str3[8]=;

輸出:sizeof(str1)=4

sizeof(str2)=6;

sizeof(str3)=8;

首先說明一點,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

總之,對於指標,sizeof操作符返回這個指標佔的空間,一般是4個位元組;而對於乙個陣列,sizeof返回這個陣列所有元素佔的總空間。char*與char容易混淆,一定要分清,而且char*="aaa"的寫法現在不被提倡,應予以避免。而strlen不區分是陣列還是指標,就讀到\0為止返回長度。而且strlen是不把\0計入字串的長度的。

二、strlen

strlen(...)是函式,要在執行時才能計算。

引數必須是字元型指標(char*),

且必須是以'\0'結尾的。當陣列名作為引數傳入時,實際上陣列就退化成指標了。

它的功能是:返回字串的長度。該字串可能是自己定義的,也可能是記憶體中隨機的,該函式實際完成的功能是從代表該字串的第乙個位址開始遍歷,直到遇到結束符'\0'。返回的長度大小不包括'\0'。

參考:sizeof與strlen的區別          

C語言strlen函式和sizeof的區別

c語言字串的兩種計算長度的方式,事實上兩者有許多不同,我們可以來 一下。sizeof sizeof 運算元所佔空間的位元組數大小 是一種c中的基本運算子。可以以型別 指標 陣列和函式等作為引數。頭檔案型別為unsigned int。運算值在編譯的時候就出結果,所以可以用來定義陣列維數。include...

突發奇想的strlen和sizeof的區別

一 sizeof sizeof 是運算子,在標頭檔案中typedef為unsigned int,其值在編譯時即計算好了,引數可以是陣列 指標 型別 物件 函式等。它的功能是 獲得保證能容納實現所建立的最大物件的位元組大小。由於在編譯時計算,因此sizeof不能用來返回動態分配的記憶體空間的大小。實際...

sizeof運算子和strlen函式的區別

1 sizeof是運算子,而strlen是函式。2 sizeof操作符的運算結果為size t,他在標頭檔案中的typedef為unsigned int。該型別保證能容納所操作物件的最大位元組大小。3 sizeof可以用型別做引數,而strlen只能用char 做引數,且必須是以 0 結尾。4 陣列...