[int佔4位元組,short佔2位元組]
1.0 回答下列問題:[答案在文章末尾]
1. sizeof(char) =
2. sizeof 'a' =
3. sizeof "a" =
4. strlen("a") =
如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起探討關於sizeof的用法了。
對於前面的題目,我想一般有一定C基礎的同志應該不會答錯1和4題。至於第2題,我想應該要清楚sizeof是求字串所佔的記憶體。"a"在記憶體中的表現為a\0,別忘了末尾的\0也佔一個位元組呢。至於第2題,可能有些人會驚訝了。C 語言中,字元常數是int 型, 因此 sizeof('a') 是 sizeof(int), 這是另一個與 C++ 不同的地方。既然字元常數是int 型,那麼int就可以存放4個字元,我們可以得到sizeof 'abcd'為 4。
1.1 回答以下題目[答案在文章末尾]
short (*ptr[100])[200];
1. sizeof(ptr) =
2. sizeof(ptr[0]) =
3. sizeof(*ptr[0]) =
4. sizeof((*ptr[0])[0])) =
是不是又開始暈了。這裡我們定義了一個100個指標數組,每個指標均指向有200個元素的數組,其記憶體佔用為200*sizeof(short)位元組。那麼這100個數組指標的大小sizeof(ptr)為100*sizeof(short*)。接著,指標數組的第一個指標ptr[0]指向第一個數組,所以這個指標ptr[0]的大小實際上就是一個普通指標的大小,即sizeof(short*)。*ptr[0]指向第一個數組的起始地址,所以sizeof(*ptr[0])實際上求的是第一個組的記憶體大小200*sizeof(short)。(*ptr[0])[0])是第一個數組的第一個元素,因為是short型,所以這個元素的大小sizeof((*ptr[0])[0]))等價於sizeof(short)。
1.2 回答以下題目[答案在文章末尾]
#include <stdio.h>
#pragma pack(push)
#pragma pack(2)
typedef struct _fruit
{
char apple;
int banana;
short orange;
double watermelon;
unsigned int plum:5;
unsigned int peach:28;
char* tomato;
struct fruit* next;
} fruit;
#pragma pack(4)
typedef struct _fruit2
{
char apple;
int banana;
short orange;
double watermelon;
unsigned int plum:5;
unsigned int peach:28;
char* tomato;
struct fruit2* next;
} fruit2;
#pragma pack(pop)
int main(int argc, char *argv[])
{
printf("fruit=%d,fruit2=%d\n",sizeof(fruit),sizeof(fruit2));
}
問題:列印結果為什麼呢?
如果你回答錯誤,那麼你對資料結構的對齊還沒有吃透。這裡#pragma pack(2)強制設定編譯器對齊屬性為2,所以第一個資料結構以2對齊,sizeof(fruit)=(sizeof(apple)+1)+sizeof(banana)+sizeof(orange)+sizeof(watermelon)+((plum:5bit+peach:28bit+15bit)/8bit)+sizeof(tomato)+sizeof(next)(注意式子中1 和 15bit 表示補齊記憶體,使其以2對齊,),既sizeof(fruit)=(sizeof(char)+1)+sizeof(int)+sizeof(short)+sizeof(double)+sizeof(char*)+sizeof(struct fruit*)。第一個資料結構聲明完了之後,又使用#pragma pack(4)強制設定編譯器對齊屬性為4,所以同理,可以得到sizeof(fruit2)=(sizeof(char)+3)+sizeof(int)+(sizeof(short)+2)+sizeof(double)+((5bit+28bit+31bit)/8bit)+sizeof(char*)+sizeof(struct fruit2*)。
-----答案:
1.0: 1,4,2,1
1.1: 400,4,400,2
1.2: fruit=30,fruit2=36
"這裡我們定義了一個100個指標數組,每個指標均指向有200個元素的數組,其記憶體佔用為200*sizeof(short)位元組。那麼這100個數組指標的大小sizeof(ptr)為100*sizeof(short*)。"
這裡有錯誤,應該是定義了一個指標數組,該數組有100個元素,其中每一個元素都是一個指標,每個指標指向一個含有200個元素的數組。