C語言基礎
struct S { char c; int i; char d; };
struct T { int i; char c; char d; };
printf("%zu %zu\n", sizeof(struct S), sizeof(struct T));假設是 char 為1位元組、int 為4位元組,且 int 放在4的倍數位址上的一般環境。執行上方程式碼時的輸出,下列何者正確?
- A6 6
- B9 6
- C12 8
查看答案與解析
正確答案:C. 12 8
int 會放在位址為4的倍數的位置,因此 struct S 在 c 之後加入3位元組的填充,i 放在從開頭算起第4位元組,d 放在第8位元組。此外,為了讓結構排成陣列時各元素的 i 也能對齊,整體大小也會進位到4的倍數,在9位元組之後補上3位元組而成為12位元組。struct T 在 i 之後接著 c 與 d 共6位元組,進位後為8位元組。把成員從大的型別依序排列,可以減少填充。
- A. 這是不考慮填充、只把成員大小相加的值(1 + 4 + 1 = 6)。
- B. 這是只考慮 int 之前的填充、沒有把整體進位到4的倍數時的值。
- C. 正確。S 含填充為12位元組,T 為8位元組。