詳解sizeof與strlen的區別

2021-09-29 21:46:29 字數 1824 閱讀 2985

知識點習題

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

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

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

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

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

功能:返回字串的長度。

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

舉例:

char arr[15]

="wang\0miao"

;int len_one =

sizeof

(arr)

;int len_two =

strlen

(arr)

; cout << len_one <<

" and "

<< len_two << endl;

輸出結果為:15 and 4

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

char

* parr =

newchar[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

點評:

void

func

(char str_arg[2]

)int

main

(void

)

輸出結果:4 5

點評:

sizeof是乙個操作符,而strlen是庫函式。

sizeof的引數可以是資料的型別,也可以是變數,而strlen只能以結尾為』\0』的字串作引數。

編譯器在編譯時就計算出了sizeof的結果,而strlen必須在執行時才能計算出來。

sizeof計算資料型別佔記憶體的大小,strlen計算字串實際長度。

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

sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧。這是因為sizeof是個操作符不是個函式。

下面關於strlen與sizeof的說法,正確的是()

a. sizeof 函式在程式執行階段執行

b. strlen 函式在程式執行階段執行

c. sizeof 的引數不可以是常量

d. strlen 函式的結果和位元組對齊有關係

正確答案:b

sizeof與strlen用法詳解 結構體對齊

includeint main int argc,char argv unsigned char a1 10 char p hello world printf sizeof p d n sizeof p printf strlen p d n strlen p printf sizeof a d ...

sizeof與strlen用法詳解 結構體對齊

include stdio.h int main int argc,char argv unsigned char a1 10 char p hello world printf sizeof p d n sizeof p printf strlen p d n strlen p printf si...

sizeof和strlen區別詳解

sizeof是運算子 當引數分別如下時,sizeof返回的值含義如下 陣列 編譯時分配的陣列空間大小 指標 儲存該指標所用的空間大小 型別 該型別所佔的空間的大小 物件 物件的實際占用空間大小 函式 函式返回型別所佔空間的大小 strlen 是函式,可以計算字串的長度,直到遇到結束符null才結束,...