1. 程式人生 > >C語言中的sizeof用法

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(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('a') 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,這個是要注意的。