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。