面試題 sizeof與strlen的區別

2021-06-25 12:01:55 字數 3608 閱讀 6108

例題: constchar *p = "hello world"; char p = "hello world";分別求長度和所占用空間大小,有啥區別?

答:求長度都可以用strlen(p),求佔記憶體空間大小第乙個不能用sizeof,第二個可以用sizeof

另外:第二個:strlen(p) = 11, sizeof(p) = 12

舉一反三:

l  

sizeof

sizeof(...)是運算子,在標頭檔案中typedef為unsigned int,其值在編譯時即計算好了,引數可以是陣列、指標、型別、物件、函式等。它的功能是:獲得保證能容納實現所建立的最大物件的位元組大小。由於在編譯時計算,因此sizeof不能用來返回動態分配的記憶體空間的大小。實際上,用sizeof來返回型別以及靜態分配的物件、結構或陣列所佔的空間,返回值跟物件、結構、陣列所儲存的內容沒有關係。具體而言,當引數分別如下時,sizeof返回的值表示的含義如下:

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

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

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

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

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

l  

strlen

strlen(...)是函式,要在執行時才能計算。引數必須是字元型指標(

char*

)。當陣列名作為引數傳入時,實際上陣列就退化成指標了。它的功能是:返回字串的長度。該字串可能是自己定義的,也可能是記憶體中隨機的,該函式實際完成的功能是從代表該字串的第乙個位址開始遍歷,直到遇到結束符null。返回的長度大小不包括null。

l   舉例

const char *p1 ="hello world";

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

輸出結果:sizeof(p1):4  strlen(p1):11

char p2 ="hello world";

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

輸出結果:sizeof(p2):12  strlen(p2):11

char p3[10] ="hello";

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

輸出結果:sizeof(p3):10  strlen(p3):5

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

char * parr = newchar[10];

printf("sizeof(parr):%d strlen(parr):%d sizeof(*parr):%d\n",sizeof(parr),strlen(parr),sizeof(*parr));

輸出結果:sizeof(parr):4  strlen(parr):0 sizeof(*parr):1

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

sizeof(int) :4

sizeof(char):1

sizeof(float):4

sizeof(double):8

double fun()  sizeof(fun()):8  函式的返回型別所佔的空間大小

下面是程式設計師面試寶典上面總結的:

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就退化為指標了。

5.大部分編譯程式 在編譯的時候就把sizeof計算過了 是型別或是變數的長度這就是sizeof(x)可以用來定義陣列維數的原因

charstr[20]="0123456789";

int a=strlen(str);//a=10;

int b=sizeof(str);//而b=20;

6.strlen的結果要在執行的時候才能計算出來,時用來計算字串的長度,不是型別佔記憶體的大小。

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

8.當適用了於乙個結構型別時或變數, sizeof 返回實際的大小,

當適用一靜態地空間陣列, sizeof 歸還全部陣列的尺寸。

sizeof 操作符不能返回動態地被分派了的陣列或外部的陣列的尺寸

9.陣列作為引數傳給函式時傳的是指標而不是陣列,傳遞的是陣列的首位址,

如: fun(char [8])

fun(char )

都等價於 fun(char *)

在c++裡引數傳遞陣列永遠都是傳遞指向陣列首元素的指標,編譯器不知道陣列的大小

如果想在函式內知道陣列的大小, 需要這樣做:

進入函式後用memcpy拷貝出來,長度由另乙個形參傳進去

fun(unsiged char*p1, int len)

unsigned char* buf= new unsigned char[len+1]

memcpy(buf, p1,len);

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

看了上面的詳細解釋,發現兩者的使用還是有區別的,從這個例子可以看得很清楚:

charstr[20]="0123456789";

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

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

上面是對靜態陣列處理的結果,如果是對指標,結果就不一樣了

char* ss ="0123456789";

sizeof(ss) 結果4 ===》ss是指向字串常量的字元指標,sizeof 獲得的是乙個指標的之所佔的空間,應該是 長整型的,所以是4

sizeof(*ss) 結果1 ===》*ss是第乙個字元 其實就是獲得了字串的第一位'0' 所佔的記憶體空間,是char類 型的,佔了 1 位

strlen(ss)= 10 >>>> 如果要獲得這

C 面試題之sizeof面試題

sizeof面試題1.cpp what is the output of the following code?美國某著名計算機軟硬體公司面試題 include include include using namespace std structa structb int main 解析 ss1是乙...

sizeof面試題選

sizeof面試題選 linux c程式設計實戰 結構體和共用體的記憶體分配是c語言的乙個難點,也是面試題中的熱點。示例1 union data1 sizeof union data1 的值為16.在編譯器預設設定的情況下,該共用體最大基本型別為double,它佔8位元組,所以此共用體以8來對齊。字...

面試題 sizeof與strlen的區別

例題 constchar p hello world char p hello world 分別求長度和所占用空間大小,有啥區別?答 求長度都可以用strlen p 求佔記憶體空間大小第乙個不能用sizeof,第二個可以用sizeof 另外 第二個 strlen p 11,sizeof p 12 舉...