C語言結(jié)構(gòu)體數(shù)組怎么讓后面的小數(shù)相加?
一般的實(shí)現(xiàn)上結(jié)構(gòu)體布局是這樣(暫不計(jì)位域和柔性數(shù)組):
首個(gè)成員偏移是 0 (標(biāo)準(zhǔn)要求)。
后一個(gè)成員需要在前一個(gè)成員之后(標(biāo)準(zhǔn)要求)。其偏移是保證該成員不與前一成員重疊的該成員對(duì)齊的最小整數(shù)倍。
結(jié)構(gòu)體的對(duì)齊是各個(gè)成員對(duì)齊的最大值。結(jié)構(gòu)體的大小是能保證放下最后成員的對(duì)齊的最小整數(shù)倍。
標(biāo)準(zhǔn)允許結(jié)構(gòu)體有更大對(duì)齊或布局更加“松垮”一點(diǎn)(有更多空隙),但實(shí)現(xiàn)一般不會(huì)這樣。
一般實(shí)現(xiàn)上數(shù)組類型的對(duì)齊同元素類型。
這里的規(guī)則無論成員和元素是否為結(jié)構(gòu)體都成立。
按題主描述,測(cè)試所用的平臺(tái)使用 LP64 數(shù)據(jù)模型,short 大小與對(duì)齊均為 2 字節(jié), int 大小與對(duì)齊均為 4 字節(jié), long 及指針大小與對(duì)齊均為 8 字節(jié)。
struct P1 { int a; char b; int c; char d; };
a 偏移為 0 , b 偏移為 4 , c 偏移為 8 (大于 4 + 1 的 4 的最小整數(shù)倍), d 偏移為 12 。 P1 對(duì)齊為 4 ,大小為 16 。
struct P2 { int a; char b; char c; long d; };
a 偏移為 0 , b 偏移為 4 , c 偏移為 5 , d 偏移為 8 。 P2 對(duì)齊為 8 , 大小為 16 。
struct P3 { short a[3]; char b[3]; };
a 偏移為 0 , b 偏移為 6 。 P3 對(duì)齊為 2 ,大小為 10 。
struct P4 { short a[3]; char *b[3]; };
a 偏移為 0 , b 偏移為 8 (大于 0 + 6 的 8 的最小整數(shù)倍)。 P4 對(duì)齊為 8 ,大小為 32 。
struct P5 { struct P3 a[2];struct P2 t;};
a 偏移為 0 , t 偏移為 24 (大于 0 + 20 的 8 的最小整數(shù)倍)。 P5 對(duì)齊為 8 ,大小為 40 。
C 中類型大小可用 sizeof 獲取,類型對(duì)齊可用 _Alignof 獲取,成員偏移可用宏 offsetof 獲取。