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的倍數位址上的一般環境。執行上方程式碼時的輸出,下列何者正確?

  1. A6 6
  2. B9 6
  3. 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位元組。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. uint32_t 與 uint8_t 分別是32位元與8位元的無號整數型別,且為小端序環境。執行上方程式碼時的輸出,下列何者正確?
  2. 執行上方把9放入3位元位元欄位的程式碼時的輸出,下列何者正確?
  3. 執行上方使用以 #define 定義之巨集 SQUARE 的程式碼時的輸出,下列何者正確?
  4. 標頭檔 sensor.h 寫成上方的樣子。#ifndef、#define、#endif 這3行的目的,下列何者正確?
  5. 把上方程式碼寫在 main 函式中執行時的輸出,下列何者正確?