#include<stdio.h>
structs1
{
charch;
intb2;
}s2;
structs3
charc1;
structs1s;
charc2;
}s4;
intmain()
inta;
intxh[4];
printf("%d\n",sizeof(a));
printf("%d\n",sizeofa);
printf("%d\n",sizeof(int));
printf("%d\n",sizeofxh);
printf("%d\n",sizeofs2);
printf("%d\n",sizeofs4);
return0;
}
輸出:44416816
第一sizeof不是函數,
1、c語言中沒有可接受參數為類型的函數,
2、沒有哪一個函數可以沒有括号的接收參數
而書中的歸納有:
1、sizeof是運算符,可用于任何變量名、類型名或常量值,當用于變量名(不是數組名)或常量時,它不需要用圓括号。
2、它在編譯時起作用,而不是運作時。
3、注意結構體中的位元組填充,位元組的填充規則有:
1)結構體變量的首位址能夠被其最寬基本類型成員的大小所整除;
2)結構體每個成員相對于結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internaladding);
3)結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組(trailingpadding)。
#pragmapack的基本用法為:#pragmapack(n),
n為位元組對齊數,其取值為1、2、4、8、16,預設是8,如果這個值比結構體成員的sizeof值小,那麼如果設為1的話,應該是完全符合了
該成員的偏移量應該以此值為準,即是說,結構體成員的偏移量應該取二者的最小值,假定設定1位元組對齊,那麼完全符合計算結果
例如:
#pragmapack(1)
charch;
charc1;
structs1s;
4441657
5還有一點要注意,“空結構體”(不含資料成員)的大小不為0,而是1。試想一個“不占空間”的變量如何被取位址、兩個不同的“空結構體”變量又如何得以區分呢于是,“空結構體”變量也得被存儲,這樣編譯器也就隻能為其配置設定一個位元組的空間用于占位了。//有的編譯器不通過,不允許定義空結構體,codeblock實作的是0,是一個灰色地帶,
6strlen:求有效長度,sizeof總體長度,
鑒于char*p="fddfgfdgfg";sizeof(p)=4;而指針指向的長度,可以用strlen()+1來擷取長度,
char數組的有效長度,用strlen,大小用sizeof();
7sizeof接受參數的時候運作,參數不會計算,
i=0;
printf("%d\n",sizeof(i+++(++i)));
printf("%d\n",i);
輸出0
輸出的大小是從裡面的參數類型最大的一個,傳回大小