淺析sizeof函數
1.簡介
sizeof函數是C語言中用於測試數據類型或數據對象所佔內存字節數的一個功能函數,其原型爲
int_t sizeof( Object) //Object爲具體的變量對象
int_t sizeof Object //此時可省略括號
int_t sizeof(Type) //Type爲基本數據類型,如int、char、array、struct、union......
說明:sizeof函數返回類型爲int_t,爲一個無符號長整型整數
2.功能
在Linux系統64位平臺進行測試(1 byte =8 bit )
程序源碼:
1 #include <stdio.h>
2
3 /* print the length of different types of data */
4 int main(int argc,char *argv[])
5 {
6 int i=10;
7 float f=2.0f;
8 double d=2.234;
9 char c='C';
10 int arrays[10];
11 struct s
12 {
13 char e;
14 int g;
15 }test;
16 union u
17 {
18 char ch;
19 int j;
20 double d;
21 }tu;
22 printf("Int %ld\n",sizeof(i));
23 printf("Float %ld\n",sizeof(f));
24 printf("Double %ld\n",sizeof(d));
25 printf("Int Arrays %ld\n",sizeof(arrays));
26 printf("Struct s %ld\n",sizeof(test));
27 printf("Union u %ld\n",sizeof(tu));
28 //test the errors
29 printf("double %ld\n",sizeof 2.33);
30 printf("int %ld\n",sizeof 66);
31
32 return 0;
33 }
測試效果:
重點關注
1.)數組:其內存所佔字節長度爲基本數據類型長度*數組長度,此處4x10
2.)指針:用於記錄存放數據的地址,其長度等於計算機內部地址總線的寬度,所以在32位系統中,佔32位4字節;在64位系統中,佔64位8字節;其長度跟指針指向的類型無關!
3.)結構體struct s { char e;int g}test; //注意結果爲8,並不是5
原因在於:計算機爲加快讀取速度,存在字節對齊問題;編譯器會對結構體和其他類型數據進行處理,讓寬度爲2的數據類型位於能被2整除的地址上,寬度爲4的基本數據類型位於能被4整除的地址上,以此類推;這樣兩個數中間就要加入字節,導致sizeof長度變長(這也是結構體數據連續存儲的緣由導致的);結構體在內存組織上是順序式的
4.)共同體union u{char h;int j;double d;}tu; //結果爲8,不是13
原因在於:共同體的數據存儲空間是重疊式的,其長度爲共同體內部最長的數據類型的長度,此處爲double型8字節