位置:首頁 > 軟件操作教程 > 編程開發(fā) > C語言 > 問題詳情

C語言 定義結(jié)構(gòu)體數(shù)組

提問人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-02

定義結(jié)構(gòu)體數(shù)組與定義結(jié)構(gòu)體變量的方法一樣,只要說明是數(shù)組,給出數(shù)組元素個(gè)數(shù)即可。例如,有結(jié)構(gòu)體類型student:

struct student 

{

    int sno; 

    char sname[10]; 

    int sage; 

    char depmt[20]; 

    float cscore;

};

如果想定義結(jié)構(gòu)體數(shù)組,與結(jié)構(gòu)變量的定義相似,也分直接定義和間接定義兩種方法。

(1)直接定義法定義結(jié)構(gòu)體數(shù)組。

struct student

{

    …

}sl[3];

定義一個(gè)student型結(jié)構(gòu)體數(shù)組,數(shù)組名為s1,其中含3個(gè)元素。 

(2)間接定義法定義結(jié)構(gòu)體數(shù)組。

struct student

{

    …

};

main()

{

    struct student s[3];

    …

}

結(jié)構(gòu)體數(shù)組的存放和普通數(shù)組一樣,也是在內(nèi)存中順序存放的,存放示意圖如圖所示。

     sno        sname       age       depmt     cscore

1001

zhangsdn

21

computer

78

1002

lisi

20

computer

83

1003

wangwu

21

computer

90

一個(gè)結(jié)構(gòu)體數(shù)組元素的長(zhǎng)度可以用sizeof運(yùn)算求得,例如:

main()

{

    struct student s [3];

    printf("%d\n",sizeof s[0]); /*計(jì)算一個(gè)結(jié)構(gòu)體數(shù)組元素的長(zhǎng)度*/

    printf("%d\n",sizeof s); /*計(jì)算一個(gè)結(jié)構(gòu)體數(shù)組整+在內(nèi)存所占的字市*/

程序執(zhí)行,輸出結(jié)果為:

    44

    132

    可能讀者經(jīng)過分析認(rèn)為,該結(jié)構(gòu)體數(shù)組元素所占的內(nèi)存字節(jié)數(shù)應(yīng)該是sno(int4字節(jié))+ sname(char10字節(jié))+ sage(int4字節(jié))+ depmt(char20字節(jié))+ cscore(int4字節(jié))=42。那么系 統(tǒng)給出的為什么是44個(gè)字節(jié)呢?

    這是因?yàn)樵赩C6.0編譯系統(tǒng)中,結(jié)構(gòu)體類型存在結(jié)構(gòu)字節(jié)邊界(Struct Member Alignment)的要求,具體為:各成員變量在內(nèi)存中的起始地址相對(duì)于結(jié)構(gòu)體變量(或數(shù)組)的起始地址的偏移量,必須為該變量的類型所占用的字節(jié)數(shù)的倍數(shù)。如果某成員的偏移量不是該類型的整數(shù)倍數(shù),則VC編譯系統(tǒng)會(huì)自動(dòng)填充一定的字節(jié)數(shù),以保證結(jié)構(gòu)體字;邊界的要求。同時(shí)VC為了確保結(jié)構(gòu)體的大小為結(jié)構(gòu)體 中所占內(nèi)存空間最大的成員類型的字節(jié)數(shù)的倍數(shù),在為最后一個(gè)成員變量申請(qǐng)空間后,還會(huì)根據(jù)需要自動(dòng)填充空缺的字節(jié)。

    假設(shè)為結(jié)構(gòu)體數(shù)組s的第一個(gè)元素s[0]分配的首地址為2000, s[0]的地址與結(jié)構(gòu)體數(shù)組的首地址相同,偏移量為0,是sizeof(int)的倍數(shù),則s[0].sno的地址空間為200~2003,之后為s[0].sname分配內(nèi)存地址2004,偏移量為4,是size(char)的倍數(shù),所以s[0].sname所占內(nèi)存地址段 為2004-2013;當(dāng)為s[0].sage分配空間時(shí),應(yīng)該分配2014,偏移量為14, 14不是sizeof(int)的倍數(shù),為保證偏移量是sizeof(int)的倍數(shù),VC自動(dòng)填空2個(gè)字節(jié),然后s[0].sage所分配的內(nèi)存地址段為2016-2019。

    按照這樣的過程,依次為s[0].d印mt分配內(nèi)存地址段為2020?2039;為s[0].cscore分配內(nèi)存地址段為2040~2043。

這樣一來,該結(jié)構(gòu)體數(shù)組元素所占字節(jié)大小為4+10+2 (系統(tǒng)自動(dòng)填充的2個(gè)字節(jié))+4+20+4=44 個(gè)字節(jié)。

因?yàn)樵摻Y(jié)構(gòu)體數(shù)組元素在內(nèi)存中占44個(gè)字節(jié),其中占內(nèi)存空間最大的成員類型為float型(4個(gè)字節(jié)),44%4為0,所以不需要在后面填充字節(jié)。


繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部