C語言 定義結構體數(shù)組
定義結構體數(shù)組與定義結構體變量的方法一樣,只要說明是數(shù)組,給出數(shù)組元素個數(shù)即可。例如,有結構體類型student:
struct student
{
int sno;
char sname[10];
int sage;
char depmt[20];
float cscore;
};
如果想定義結構體數(shù)組,與結構變量的定義相似,也分直接定義和間接定義兩種方法。
(1)直接定義法定義結構體數(shù)組。
struct student
{
…
}sl[3];
定義一個student型結構體數(shù)組,數(shù)組名為s1,其中含3個元素。
(2)間接定義法定義結構體數(shù)組。
struct student
{
…
};
main()
{
struct student s[3];
…
}
結構體數(shù)組的存放和普通數(shù)組一樣,也是在內存中順序存放的,存放示意圖如圖所示。
sno sname age depmt cscore1001 | zhangsdn | 21 | computer | 78 |
1002 | lisi | 20 | computer | 83 |
1003 | wangwu | 21 | computer | 90 |
一個結構體數(shù)組元素的長度可以用sizeof運算求得,例如:
main()
{
struct student s [3];
printf("%d\n",sizeof s[0]); /*計算一個結構體數(shù)組元素的長度*/
printf("%d\n",sizeof s); /*計算一個結構體數(shù)組整+在內存所占的字市*/
程序執(zhí)行,輸出結果為:
44
132
可能讀者經(jīng)過分析認為,該結構體數(shù)組元素所占的內存字節(jié)數(shù)應該是sno(int4字節(jié))+ sname(char10字節(jié))+ sage(int4字節(jié))+ depmt(char20字節(jié))+ cscore(int4字節(jié))=42。那么系 統(tǒng)給出的為什么是44個字節(jié)呢?
這是因為在VC6.0編譯系統(tǒng)中,結構體類型存在結構字節(jié)邊界(Struct Member Alignment)的要求,具體為:各成員變量在內存中的起始地址相對于結構體變量(或數(shù)組)的起始地址的偏移量,必須為該變量的類型所占用的字節(jié)數(shù)的倍數(shù)。如果某成員的偏移量不是該類型的整數(shù)倍數(shù),則VC編譯系統(tǒng)會自動填充一定的字節(jié)數(shù),以保證結構體字;邊界的要求。同時VC為了確保結構體的大小為結構體 中所占內存空間最大的成員類型的字節(jié)數(shù)的倍數(shù),在為最后一個成員變量申請空間后,還會根據(jù)需要自動填充空缺的字節(jié)。
假設為結構體數(shù)組s的第一個元素s[0]分配的首地址為2000, s[0]的地址與結構體數(shù)組的首地址相同,偏移量為0,是sizeof(int)的倍數(shù),則s[0].sno的地址空間為200~2003,之后為s[0].sname分配內存地址2004,偏移量為4,是size(char)的倍數(shù),所以s[0].sname所占內存地址段 為2004-2013;當為s[0].sage分配空間時,應該分配2014,偏移量為14, 14不是sizeof(int)的倍數(shù),為保證偏移量是sizeof(int)的倍數(shù),VC自動填空2個字節(jié),然后s[0].sage所分配的內存地址段為2016-2019。
按照這樣的過程,依次為s[0].d印mt分配內存地址段為2020?2039;為s[0].cscore分配內存地址段為2040~2043。
這樣一來,該結構體數(shù)組元素所占字節(jié)大小為4+10+2 (系統(tǒng)自動填充的2個字節(jié))+4+20+4=44 個字節(jié)。
因為該結構體數(shù)組元素在內存中占44個字節(jié),其中占內存空間最大的成員類型為float型(4個字節(jié)),44%4為0,所以不需要在后面填充字節(jié)。
點擊加載更多評論>>