sizeof 與 strlen 的區別

x541534530發表於2014-06-29

sizeofstrlen的區別

1:本質區別

sizeof:屬於操作符一類結果型別為size_t sizeof操作符的結果型別是size_t。該操作符遞的引數可以是變數名,也可以是變數的型別。

例子:

int a;

sizeof(a) == sizeof(int)

sizeof(a) == sizeof a ====> 應為我們說過他是一個操作符,而不是函式沒有引數一說.

strlen:是一個標準庫

原型:size_t strlen ( const char * str );

引數:是一個char型別的指標

返回值:是引數指標指向的字串的的長度以'\0'為結束符

參考連結:http://www.cplusplus.com/reference/cstring/strlen/?kw=strlen

例子: 

/* strlen example */

#include <stdio.h>

#include <string.h>

 

int main ()

{

char szInput[256];

printf ("Enter a sentence: ");

gets (szInput);

printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput));

return 0;

}

 

2:用法的區別

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

1. 程式在編譯的時候就把sizeof計算過了,是型別或是變數的長度。所以sizeof(xxx)可以用來定義陣列的大小。

char str[20]=”sizeof and strlen”;  

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

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

2. strlen的結果要在執行的時候才能計算出來,用來計算字串的長度以’\0’未結束符,而不是佔用記憶體的大小。 

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

4. 當使用一個結構型別或變數時,sizeof返回實際的大小(該結構型別定義變數後,變數佔用的記憶體大小)。當使用一靜態的空間陣列時(int test[10]),sizeof返回全部陣列的尺寸(該陣列佔用的記憶體空間:4 * 10)Sizeof操作符不能返回被動態分配的空間大小,外部的陣列的尺寸。

5. 陣列作為引數傳給函式時傳得是指標而不是陣列,傳遞的是陣列的首地址。在C++裡傳遞陣列永遠都是傳遞指向陣列首元素的指標,編譯器不知道陣列的大小,如果想在函式內知道陣列的大小需要在函式裡面用memcpy將陣列複製出來,長度則需要另一個引數。 

6. 計算結構變數的大小就必須討論資料對其問題。 

7. .sizeof操作符不能用於函式型別,不完全型別或位欄位。不完全型別指具有未知儲存大小資料的資料型別,如未知儲存大小的陣列型別,未知內容的結構或聯合型別,void型別等.

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

9.  strlen要在執行時才能計算。引數必須是字元型指標(char*)。當陣列名作為引數傳入時,實際上陣列就退化成指標了。 它的功能是:返回字串的長度。該字串可能是自己定義的,也可能是記憶體中隨機的,該函式實際完成的功能是從代表該字串的第一個地址開始遍歷,直到遇到結束符NULL。返回的長度大小不包括NULL。

 

 

相關文章