一.本質區別
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使用...