C語言中sizeof與strlen區別

2022-07-29 18:09:19 字數 4569 閱讀 7142

一.本質區別

sizeof 和 strlen 有本質上的區別。sizeof 是c 語言的一種單目運算子,如++ 、-- 等,並不是函式,sizeof 的優先順序為2 級,比/ 、% 等3 級運算子優先順序高,sizeof 以位元組的形式給出運算元的儲存空間的大小。而strlen 是乙個函式,是由c 語言的標準庫提供的。strlen 計算的 是字串的長度。

二.使用區別

1.sizeof

sizeof 的運算元可以是資料型別、函式、變數,表示式使用方式為:

(1)資料型別 sizeof  (type )

例如我們要計算乙個int 型資料的儲存空間可以用:sizeof  (int)。需要注意的是 sizeof 的運算元是資料型別時要加括號。其數值大小為該資料型別所佔的儲存空間的位元組數。

(2)變數 sizeof (變數名)

如果定義  int  a ,可以使用sizeof(a )計算a 變數佔據的儲存空間。具體大小 與a 的型別有關。

注意:由於sizeof 是操作符sizeof a 或sizeof(a )都可以。(可以不使用括號), 如果運算元是陣列名則給出陣列所占用記憶體的位元組數。如果陣列名做函式的引數傳遞時退化為指標。

(3)表示式 sizeof  (表示式)

sizeof 可以對乙個表示式求值,編譯器根據表示式的最終結果型別來確定大小, 一般不會對表示式進行計算。例如:sizeof(1+1.5)

(4 )函式呼叫 sizeof (函式名())

sizeof 也可以對乙個函式呼叫求值,其結果是函式返回型別的大小,函式並不會被呼叫,舉例來說定義如下函式:

int myprint ()

int main()

結果只列印函式返回型別的sizeof 值,並沒有列印hello 說明函式myprint 並沒有呼叫。

c99  標準規定,函式、不能確定型別的表示式以及位域(bit-field )成員不能被 計算sizeof 值,即下面這些寫法都是錯誤的:

如:sizeof   (myprint )

(注意sizeof     (myprint  ()是可以的))

或者sizeof 乙個void 返回型別的函式如:

void foo ()

sizeof( foo () );

以及位域:

struct s

; sizeof( s.f1 );

2.strlen

strlen 的應用則不像sizeof 那麼廣泛,strlen 的引數必須是char * 的指標,如果用 strlen 計算資料型別strlen(int )這種用法是錯誤的。strlen 的計算必須依賴字串行中的』\0』字元,strlen就是通過判斷是否遇到』\0』來判斷字串行是否結束的。 它的計算原理類似於下面的兩條語句

while (*p !=』\0』 )

length++

strlen 的用法:分為以下幾種引數

(1)char *  指標

strlen (指標名) 

如果引數是指標則計算該指標指向字串行的長度。(以』\0』作為判斷標誌)例如: 定義char *p=「hello world」 ;strlen  (p )=11 ,而sizeof(p )=4 。可以看到strlen計算的是指標指向的字串的長度而 sizeof  計算的是指標本身所占用的記憶體空間的大小。

(2 )陣列 strlen(陣列名)

如果引數是陣列的話,實際傳遞的是乙個指標,strlen 會按照上面處理指標的模式處理該陣列。

我們可以看下面的例子:

char a=」hh」;

strlen(a);

很顯然strlen 的結果是2 。但是如果陣列是這樣賦值的呢?

char a=;

strlen(a);

那麼現在strlen(a )的結果又是多少呢?這個數就不一定了,原因是strlen 會去計算a 位址開始的字串的長度,由於前一種賦值方式會將hh  以字 符串的形式賦值給陣列會將字串結束符』\0』一同賦值,這時 strlen  就會檢查到結束符停止計算,而第二種復值方式是以單個字元的形式賦值沒有結束 符』\0』,這時我們用sizeof 得到的結果是正常的,而用 strlen  由於找不到結束符,會繼續的計算直到找到結束符為止。所以這個數是不確定。 

sizeof() 和strlen() 簡析

關於sizeof() 運算子和 strlen() 函式很多人都在遇到的時候時常時常搞不清,所以簡要的講解下。

首先兩個有點相似性,可以用來計算大小。

sizeof() 運算子:

它的計算的是所佔空間的總大小,一般變數定義之後就確定了。

#include

using namespace std;

int main()

;2. sizeof(ai);          // = 2*4 = 8

1.3.2 常量字串與字元陣列的記憶體分配方式相同。

cpp**:

1. char ac = "abcd";  //注意陣列末尾的字串終結符'\0'

2. sizeof(ac);          // = 5*1 = 5

3. sizeof("abcd");      // = 5*1 = 5

1.3.3 陣列和指標所佔的位元組數不同,應注意區分。

1. int *pi = new int[10]; //這是指標

2. sizeof(pi);            // = 4

3. 4. int ai[10];

5. int *p = ai;           //這還是指標

6. sizeof(p);             // = 4

7. 8. double* (*a)[3][6];    //看成(double *) (*a)[3][6],即乙個3×6的二維陣列,陣列元素為指標,指向double型別。

9. sizeof(a);             // = 4,a為指向上述二維陣列的指標

10. sizeof(*a);            // = sizeof(double *)*3*6 = 72,*a表示上述二維陣列

11. sizeof(**a);           // = sizeof(double *)*6 = 24,**a即*(*a),表示double*[6],是元素為double指標的一維陣列。

12. sizeof(***a);          // = sizeof(double *) = 4,表示上述一維陣列中的第乙個元素,元素型別為double指標。

13. sizeof(****a);         // = sizeof(double) = 8,表示上述陣列首元素指向的double型別。

1.3.4 函式形式引數中的陣列會蛻變為指標,原因是陣列引數「傳址呼叫」,呼叫者只需將實參的位址傳遞過去。有一種情況例外,那就是引數是指向陣列的指標。

1. void acf(char p[3])     //引數型別是int,表示指向int的指標

2. 5. void aif(int p)       //引數型別是int,表示指向int的指標

6. 9. void pif(int (*p)[6])   //引數型別是int (*)[6],表示指向int陣列的指標

10. 

14. void ppf(int *p[6])     //引數型別是int *,表示指向int指標的指標

15. 

1.4. 類和結構體的記憶體分配。

1.4.1 空類或空結構體占乙個位元組。

cpp**

1. class cempty ;

2. sizeof(cempty); // = 1

3. 4. struct sempty ;

5. sizeof(sempty); // = 1

1.4.2 非空類和結構體所佔位元組為所有成員佔位元組的和,但是不包括成員函式和靜態成員所佔的空間。

cpp**

1. class cint : public cempty ;

4. sizeof(cint); // = 4;

5. 6. class cfunc

8. };

9. sizeof(cfunc); // = 1;

10. 

11. struct sint : sempty ;

14. sizeof(sint); // = 1;

1.4.3 位元組對齊

為了加快計算機的取數速度,編譯器預設對記憶體進行位元組對齊。對結構體(包括類)進行位元組對齊的原則是:

1)結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;

2)結構體每個成員相對於結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);

3)結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組(trailing padding)。

cpp**

1. struct sbyte1

2. ;

7. sizeof(sbyte1);  // = 16

8. 9. struct sbyte2

10. ;

15. sizeof(sbyte2);  // = 24,為了湊成8的倍數,填充20~23

c語言中陣列與sizeof

我以前的理解是 陣列名字就是指向陣列首元素的指標,然而用sizeof 運算元組名字,把我又弄得有些疑惑了。查了查資料,終於明白了。原來,陣列名字做形參時才被當作指標。而sizeof 並不是乙個函式,而是乙個單目運算子,所以sizeof 裡寫陣列名字,返回的就是陣列佔了多少位元組。例如 char a ...

C語言中sizeof與strlen區別

sizeof 初始的分配的空間大小,期中 sizeof unsigned char 1 sizeof signed char 1 sizeof int 4 sizeof unsigned int 4 sizeof short int 2 sizeof unsigned short 2 sizeof ...

c語言中的sizeof

一 sizeof的概念 sizeof是c語言的一種單目操作符,如c語言的其他操作符 等。它並不是函式。sizeof操作符以位元組形式給出了其運算元的儲存大小。運算元可以是乙個表示式或括在括號內的型別名。運算元的儲存大小由運算元的型別決定。二 sizeof的使用方法 1 用於資料型別 sizeof使用...