C語言中的sizeof用法
C語言中的sizeof是一個很有意思的關鍵字,經常有人用不對,搞不清不是什麼。我以前也有用錯的時候,現在寫一寫,也算是提醒一下自己吧。反正現在來看,還在搞sizeof是什麼意思,怎麼用正確,還是有點搞笑,都經常用的東西,沒有理解透徹,就差的太遠了。
第一 sizeof是什麼
sizeof是C語言的一種單目操作符,如C語言的其他操作符++、--等,sizeof操作符以位元組形式給出了其運算元的儲存大小。運算元可以是一個表示式或括在括號內的型別名。這個運算元不好理解對吧?後面慢慢看就明白了。sizeof的返回值是size_t,在64位機器下,被定義為long unsigned int。
第二 sizeof如何使用
1、用於資料型別
使用形式: sizeof(type)。其中type如int 、double等。 例如sizeof(int)、sizeof(char*)、sizeof(double)。這個時候sizeof後面的型別必須用括號()包起來,不包起來是錯誤的,通過不了編譯。其中sizeof(void*)在64位下是8,而sizeof(void)是1。其實,在C語言中sizeof(函式),如sizeof(main),結果也是1。但是在C++中,sizeof(void)和sizeof(函式)都是非法的,通過不了編譯,後面C++就不說了,現在講C嘛。其實sizeof(函式),sizeof(void)雖然是1,但是是不正確的使用方式。
2、用於變數
使用形式: sizeof(var)或sizeof var。當操作基本資料型別的時候,在我64位電腦的結果如下
其中sizeof('a') 4有點奇怪哈。sizeof(char) 1 sizeof(char) 1 sizeof(short) 2 sizeof(int) 4 sizeof(long) 8 sizeof(float) 4 sizeof(double) 8 sizeof(long double) 16 sizeof(int*) 8 sizeof('a') 4 sizeof(1) 4 sizeof(1.0f) 4 sizeof(1.0) 8 sizeof "abc" 4
當運算元是聯合型別時,sizeof是其最大位元組成員的位元組數。當運算元是結構型別時,sizeof是其成員型別的總位元組數,包括補充位元組在內。如下:
union U
{
char c;
double d;
}U;
sizeof(U) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;
而sizeof結構體的時候,還要考慮對齊的問題:struct S
{
char c;
double d;
}s;
在我的電腦上,sizeof(s)的大小是16。
基本上說的比較清楚了,但有些時候和函式引數相關的時候,還是要注意,比如
int calc(char a[10])
{
printf("%d\n",sizeof(a));
return 0;
}
int main()
{
char a[10]={"hello"};
calc(a);
return 0;
}
列印的結果是8,而不是10,這個是要注意的。