網站首頁 個人範例 行業範例 行政範例 職場範例 校園範例 書信範例 生活範例 節日文化範例

電腦中的sizeof函數

欄目: 互聯網 / 發佈於: / 人氣:3.1W
  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.