strlen和sizeof函式區別 深入理解

2021-05-25 07:50:50 字數 1479 閱讀 3826

1.函式型別

#include

size_t strlen(const char *s);

size_t sizeof()

2.本質區別

本質上,strlen是函式,而sizeof是算符。strlen需要進行一次函式呼叫,而對於sizeof而言,因為緩衝區已經用已知字串進行了初始化,起長度是固定的,所以sizeof在編譯時計算緩衝區的長度。sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧。

3.引申區別

1). strlen計算不包含終止null位元組的字串長度,而sizeof則計算包括終止null位元組的緩衝區長度。

2). strlen只能用char*做引數,且必須是以'/0'結尾的。sizeof可以用型別做引數,還可以用函式做引數。陣列傳遞給strlen就退化為指標了,傳遞給sizeof的引數不退化。  

3). 當適用了於乙個結構型別時或變數,sizeof返回實際的大小;當適用一靜態地空間陣列,sizeof 歸還全部陣列的尺寸。sizeof 操作符不能返回動態地被分派了的陣列或外部的陣列的尺寸  

在c/c++裡傳遞陣列永遠都是傳遞指向陣列首元素的指標,編譯器不知道陣列的大小如果想在函式內知道陣列的大小,需要這樣做:  

fun(const char  *s, int len)

char* buf [len+1]; 

memcpy(buf, s, len);

5). sizeof操作符不能用於函式型別、不完全型別或位字段。不完全型別是指具有未知儲存大小的資料資料型別,如未知儲存大小的陣列型別,void型別等。

4.sizeof另解

程式儲存分布有三個區域:棧、靜態和動態。所有能夠從**直接操作的物件,包括任何型別的變數、指標,都是在棧上的;動態和靜態儲存區是靠棧上的指標間接操作的。sizeof 操作符,計算的是物件在棧上的投影體積;除了棧上的char陣列這乙個特殊情況之外。。。

sizeof計算的都是型別的長度。如果是物件,則轉換成型別,再計算型別的長度。 

在32位系統中。指標型別是32位,4個位元組。所以對任何指標用sizeof結果都是4;  

1). 陣列用sizeof = 陣列的步長(型別的長度)*陣列的長度。  

2). 復合結構sizeof= 各個資料成員的型別長度*宣告的個數之和。(要考慮到位元組對齊)  

typedef struct student

int data;

static int number;

} node1;

typedef struct teacher

int data;

char name;

} node2;

sizeof(node1)=4個位元組。//靜態變數是放在全域性資料區,sizeof計算棧分配的大小,不會計算靜態變數的。

sizeof(node2)=8個位元組。//位元組對齊

3). 引用用 sizeof 。 如果引用的是物件,則先轉化成引用的物件型別。如果是復合型別。則用2。否則直接計算。

sizeof和strlen函式區別

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

關鍵字sizeof 和函式strlen

關鍵字sizeof 用來計算變數或者型別所佔的記憶體大小。函式strlen 用來計算字串的長度 只能用char 做引數 char str 20 helloworld sizeof str 的值是20 strlen str 的值是10 char str helloworld sizeof str 的值...

C語言之 sizeof 和strlen 函式

sizeof 既是乙個關鍵字,還是乙個運算子。而不是乙個函式。sizeof的作用週期是編譯階段。sizeof的作用是用來返回 裡面物件占用的記憶體位元組數。其計算物件型別可以為 資料型別 變數 函式 陣列 指標等 ref strlen是乙個c庫函式 string.h 用來返回乙個字串的長度 注意,字...