sizeof與strlen的用法

來源:互聯網
上載者:User

解析C/C++語言中的sizeof

一、sizeof的概念
  sizeof是C語言的一種單目操作符,如C語言的其他動作符++、--等。它並不是函數。sizeof操作符以位元組形式給出了其運算元的儲存大小。運算元可以是一個運算式或括在括弧內的類型名。運算元的儲存大小由運算元的類型決定。

二、sizeof的使用方法
  1、用於資料類型

  sizeof使用形式:sizeof(type)

  資料類型必須用括弧括住。如sizeof(int)。

  2、用於變數

  sizeof使用形式:sizeof(var_name)或sizeof var_name

  變數名可以不用括弧括住。如sizeof (var_name),sizeof var_name等都是正確形式。帶括弧的用法更普遍,大多數程式員採用這種形式。

  注意:sizeof操作符不能用於函數類型,不完全類型或位欄位。不完全類型指具有未知儲存大小的資料類型,如未知儲存大小的數群組類型、未知內容的結構或等位型別、void類型等。

  如sizeof(max)若此時變數max定義為int max(),sizeof(char_v) 若此時char_v定義為char char_v [MAX]且MAX未知,sizeof(void)都不是正確形式。

三、sizeof的結果   

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

  1、若運算元具有類型char、unsigned char或signed char,其結果等於1。

  ANSI C正式規定字元類型為1位元組。

  2、int(4)、unsigned int(4) 、short int(2)、unsigned short(2) 、long int(4) 、unsigned long (4)、float(4)、double(8)、long double(8)類型的sizeof 在ANSI C中沒有具體規定,大小依賴於實現括弧內為sizeof的結果。

  3、當運算元是指標時,sizeof依賴於編譯器。例如Microsoft C/C++7.0中,near類指標位元組數為2,far、huge類指標位元組數為4。一般Unix的指標位元組數為4, 一般來說指標位元組數為4。

例1:

int *p;

int a[5];

p = a;

sizeof(p)的結果是4。

例2:

 const char* pstars[]={"aa","bb","cc","dd"};

const int starCount=size of pstars/sizeof pstars[0];

starCount是指標數組pstars中的元素個數4。

因為pstars是一個常指標數組,const代表指標中的資料不能修改,即不能使用諸如*pstars[0] = 'c';之類,會有編譯錯誤的。

先放下const不談,pstars的數群組成員是4個指標,所以其佔用的空間是4個指標所佔用的空間即4*4 = 16,而pstars[0]是該數組的一個元素,即一個指標,所佔空間即為4個位元組。所以最後計算結果為4。

  4、當運算元具有數群組類型時,其結果是數組的總位元組數。

例如:int a[12];sizeof(a)的結果是12 * 4 = 48。

  5、等位型別運算元的sizeof是其最大位元組成員的位元組數。結構類型運算元的sizeof是這種類型對象的總位元組數,包括任何墊補在內。  

  讓我們看如下結構:

  struct {char b; double x;} a;

  vc6.0結果為16。

  這是因為編譯器在考慮對齊問題時,在結構中插入空位以控制各成員對象的地址對齊。如double類型的結構成員x要放在被8整除的地址。可以通過#pragma pack(n)改變位元組對齊。

例如:

struct mystruct1{ 
    char a;             //1
    int b;               //4
    short c;           //2
    long d;            //4

    double e;        //8
};

預設的結構體的sizeof結果是24。

#pragma pack(2)

struct mystruct1{ 
    char a;             //1
    int b;               //4
    short c;           //2
    long d;            //4

    double e;        //8
};

此時結果為20。

我的推論:

    預設時以最大位元組作為儲存單位,即8位元組,而對齊則以兩兩之間的最大位元組對齊,比如char與int以4位元組對齊,佔用了一個8位元組空間,short重新開始一個8位元組空間,short與long以4位元組對齊,再結合成一個8位元組空間,同時double單獨佔用一個8位元組空間,所以最後總空間為24位元組。

    改變對齊為2位元組時,則char以2位元組後接int的2個2位元組,再接short的2位元組,再接long的2個2位元組最後接double的4個2位元組,此時計算總數為2位元組 *  (1+2+1+2+4)= 20位元組。

注意:#pragma pack()可以還原為預設對齊,而要改變其對齊,#pragma pack(n)必須放在使用之前。也可以使用

#pragma pack(push) //儲存對齊狀態

#pragma pack(pop)  //恢複對齊狀態

這一對來進行對齊的改變。

        C++中類也是類似結構體的sizeof的計算方式,計算類對象中資料成員所佔用的空間,不過static對象不計算在內。

例如:

class A{
     char b; 
     static double x; 
public:
      void count(int *aa);
};

此時sizeof(A)的結果是1。

  6、如果運算元是函數中的數組形參或函數類型的形參,sizeof給出其指標的大小。

例如:

void a(int *c)

{

    printf("%d/n",sizeof(c));

}

void a(int c[13])

{

    printf("%d/n",sizeof(c));

}

列印的都是4。

四、sizeof與其他動作符的關係
  sizeof的優先順序為2級,比/、%等3級運算子優先順序高。它可以與其他動作符一起組成運算式。如i*sizeof(int);其中i為int類型變數。

五、sizeof的主要用途
  1、sizeof操作符的一個主要用途是與儲存分配和I/O系統那樣的常式進行通訊。例如:

  void *malloc(size_t size),

  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。

  2、sizeof的另一個的主要用途是計算數組中元素的個數。例如:

  void * memset(void * s,int c,sizeof(s))。

六、建議
  由於運算元的位元組數在實現時可能出現變化,建議在涉及到運算元位元組大小時用sizeof來代替常量計算。

 

解析C/C++語言中的strlen與sizeof的區別

  1.從功能定義上,strlen函數,用來求字串的長度,sizeof函數是用來求指定變數或變數類型等所佔用記憶體的大小;

  2.sizeof是運算子,而strlen是C庫函數strlen只能用char*做參數,且以'/0'結尾的;  對於靜態數組處理:     char str[20]="0123456789";     strlen(str)=10;   //表示數組中字串的長度     sizeof(str)=20;   //表示陣列變數分配的長度  對於指標處理:     char *str="0123456789";     strlen(str)=10;     //表示字串的長度     sizeof(str)=4;      //表示指標變數的所佔記憶體大小     sizeof(*str)=1;     //表示'0'這個字元變數的所佔記憶體大小

 

參考:

sizeof:

http://www.zxbc.cn/html/20081009/66510.html

http://dev.chinaitzhe.com/c/2008-06/121394082764090.html

http://dev.csdn.net/Develop/article/42/42446.shtm

http://www.softhouse.com.cn/news/show/1660.html

strlen:

http://blog.chinaunix.net/u1/36719/showart_288193.html

 

以上均使用VC6.0進行測試。

很崩潰,寫了那麼多,花了我半天時間,結果沒傳上來,還弄丟了,累死之前先氣死了,唔。。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.