C語言中 sizeof

轉自:http://www.cnblogs.com/wangkangluo1/archive/2011/09/27/2193072.html

sizeof是C語言的一種單目操作符

sizeof操作符以字節形式給出了其操作數的存儲大小,操作數可以是一個表達式或括在括號內的類型名,操作數的存儲大小由操作數的類型決定。
sizeof(char)= 1;
sizeof(unsigned char) = 1;
sizeof(signed char)= 1;
sizeof(int)= 4;
sizeof(unsigned int)= 4;
sizeof(short int)= 2;
sizeof(unsigned short) = 2;
sizeof(long int)= 4;
sizeof(unsigned long)= 4;
sizeof(float)= 4;
sizeof(double)= 8;
sizeof(long double)= 12;
char *p;      //Linux中
sizeof(p) = 4;
當操作數具有數組類型時,其結果是數組的總字節數。
 例如: char a[5];
          int  b[5];
          sizeof(a) = 5;
          sizeof(b) = 20;
   
當操作數是具體的字符串或者數值時,會根據具體的類型進行相應轉化。
 
    例如: sizeof(8)    = 4;  //自動轉化爲int類型
          sizeof(8.8)  = 8;  //自動轉化爲double類型,注意,不是float類型
          sizeof("ab") = 3   //自動轉化爲數組類型,
                             //長度是4,不是3,因爲加上了最後的'\n'符
                             //有資料說,會自動轉化爲指針類型(Linux爲4)
                             //可能和操作系統與編譯器有關係
         
當操作數是聯合類型時,sizeof是其最大字節成員的字節數。
 當操作數是結構類型時,sizeof是其成員類型的總字節數,包括補充字節在內。    
 還是讓我們拿例子來說話:
    union  u{             //對union來說
          char c;
          double d;
    }u;
    sizeof(u) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;

  struct a{             //對struct來說
          char b; 
          double x;
    }a;   
  在Linux上: sizeof(a) = 12;
    而一般sizeof(char) + sizeof(double) = 9; 
  這是因爲編譯器在考慮對齊問題時,在結構中插入空位以控制各成員對象的地址對齊。
    但如果全對齊的話,sizeof(a) = 16, 這是因爲b被放到偏移量爲0的地址,佔1個字節;
    在存放x時,double類型長度爲8,需要放到能被8整除的偏移量上,這時候需要補7個空字節,
    達到8個,這時候偏移量爲8,放上x後長度爲16。
    在此例中,所有的結構成員都要放在被4整除的地址(Linux的存放方式),這裏補3個字節,所以爲12。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章