範文齋

位置:首頁 > 行業範文 > 網際網路

電腦中的sizeof函式

  sizeof函式

 1,是什麼?

電腦中的sizeof函式

sizeof其實就是一個運算子,和那些+,-一樣的東西,在程式編譯的時候進行解析轉換。雖然我們經常見到sizeof後面跟著個小括號,長得和函式差不多,但它和函式完全是兩碼事。

 2,有什麼用?

sizeof其實就是用於告訴我們編譯器在為某一特定資料或者某種資料型別的資料在儲存空間中開闢空間時,開闢的空間大小,以位元組為單位。

3,怎麼用?

sizeof(型別),或者sizeof(變數)都可以,得到的就是型別或者變數的儲存空間。當對變數用的時候,也可以沒有括號,直接 sizeof 變數,但一般不用(我一般都是隻記一種通用的用法……)。

4,用的時候要注意什麼?

(1)sizeof返回的佔用空間大小是為這個變數開闢的大小,而不只是它用到的空間。和現今住房的建築面積和實用面積的概念差不多。所以對結構體用的時候,大多情況下就得考慮位元組對齊的問題了。

(2)對位域成員等連編譯器都無法確定儲存空間的東西不能用。這個應該比較好理解,因為sizeof返回的都是以位元組為單位的資料,你讓它去求那些以位為單位的大小,這不是存心難為編譯器嘛。所以編譯器採用的方案是統一不受理,即使你說你剛好是8位,佔一個位元組,編譯器也不理你。

(3)sizeof返回的資料型別是unsigned int。因為C中不同型別資料混合運算時的自動轉換,有時候不注意的話可能會出問題,具體可以參照下面的程式例子。

(4)要注意陣列名和指標變數的區別。通常情況下,我們總覺得陣列名和指標變數差不多,但是在用sizeof的時候差別很大,對陣列名用sizeof返回的是整個陣列的大小,而對指標變數進行操作的時候返回的.則是指標變數本身所佔得空間,在32位機的條件下一般都是4。而且當陣列名作為函式引數時,在函式內部,形參也就是個指標,所以不再返回陣列的大小。

 5,例項分析

原始碼:

#includeint main(){ int iVal = 3; printf("The size of type int is %d n", sizeof(int)); printf("The size of iVal is %dn", sizeof(iVal)); printf("The size of iVal is %dn", sizeof iVal); if((iVal - sizeof(int)) < 0) { printf("The return type is intn"); } else { printf("The return type is unsigned intn"); } char chArrayCon[7]; char *chp; chp = chArrayCon; printf("The size of chArrayCon is %d, The size of chp is %dn", sizeof(chArrayCon), sizeof(chp)); int iArraySize = 3; char chArrayVar[iArraySize]; printf("The size of chArrayVar is %dn", sizeof(chArrayVar)); return 0;}

執行結果:

The size of type int is 4 The size of iVal is 4The size of iVal is 4The return type is unsigned intThe size of chArrayCon is 7, The size of chp is 4The size of chArrayVar is 3

結果分析:

程式碼第一部分主要就是簡單的表示了一下用法。

第二部分說明了注意事項的第三項。按說,iVal的值是3,減4的話應該是-1,小於0,輸出的應該是"he return type is int"。但是由於當int和unsigned int一起運算時,會預設變成unsigned int,所以結果會是一個很大的unsigned int型別的數,是大於0的。

程式碼第三部分就簡單說明了陣列名和指標變數的區別,即使你把指標變數指向陣列名,編譯器依然能夠分辨出區別。

以上講述的都沒有考慮在C99標準下的情況。因為在C99標準下有種特殊情況,那就是不定長陣列的使用。當對不定長陣列名使用sizeof的話,返回的也是整個陣列的大小,就像例項中第四塊程式碼一樣。但是這並不是在編譯階段執行的,而是在程式執行階段執行的。因為在編譯的時候,編譯器一般不知道變數的值是多少。(當然例子中我直接賦值3,可能不方便理解,可以假想iArraySize是通過scanf來獲得實際數值的,然後再宣告陣列的)。對於這種情況,實際中應用的並不多,大家可以當做特殊情況對待即可,或者直接忽略掉也行……

  6總結

其實sizeof的作用就是告訴我們分配給變數的“建築面積”的大小,只要記得這一點應該就夠了,不管這個變數型別是普通的整型資料,還是結構體,共用體,列舉……記住這一點後,當我們再去想知道sizeof對不同資料型別操作返回的值到底是什麼的時候,只需搞明白那些資料型別到底要消耗多少“建築面積”就可以啦!

strlen()函式

C庫函式 size_t strlen(const char *str) 計算字串str的長度,但不包括終止空字元。

宣告

以下是宣告的strlen() 函式。

size_t strlen(const char *str)

引數

str -- 這是字串的長度要計算的。

返回值

這個函式返回字串的長度。

例子

下面的例子顯示使用strlen() 函式。

#include#includeint main (){ char str[50]; int len; strcpy(str, "This is "); len = strlen(str); printf("Length of |%s| is |%d|", str, len); return(0);}

讓我們編譯和執行上面的程式,這將產生以下結果:

Length of |This is | is |26|

sizeof與strlen的用法區別

1. sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。

2. sizeof是運算子(C++ 關鍵字),strlen是函式。

3. sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以””結尾的。sizeof還可以用函式做引數,比如:

short f();printf("%dn", sizeof(f()));

輸出的結果是返回值的型別的大小, 即sizeof(short)=2。

4. 陣列做sizeof的引數不退化,傳遞給strlen就退化為指標了。大部分編譯程式在編譯的時候就把sizeof計算過了,是型別或是變數的長度,這就是sizeof(x)可以用來定義陣列維數的原因。

char str[20]="0123456789";int a=strlen(str); //a=10;int b=sizeof(str); //b=20;

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

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

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

7. 陣列作為引數傳給函式時傳的是指標而不是陣列,傳遞的是陣列的首地址,如:

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對指標的話,結果是相應的型別:

char* ss = "0123456789";sizeof(ss)

結果是4 => ss是指向字串常量的字元指標,sizeof 獲得的是一個指標的之所佔的空間,應該是長整型的,所以是4. sizeof(*ss) 結果 1, => *ss是第一個字元,其實就是獲得了字串的第一位“0” 所佔的記憶體空間,是char型別的,佔了1個位元組,strlen(ss)= 10 >>>> 如果要獲得這個字串的長度,則一定要使用 strlen.

標籤:sizeof 電腦 函式