什麼是結構(struct)

C語言中,把多個(可為不同型別的)值(成員)整合成一個型別來處理的機制。以 struct sensor { int id; float value; }; 的方式定義,變數 s 的成員以 s.id 使用,透過指向結構的指標 p 則以 p->id 使用。成員依宣告順序排列在記憶體中,但為了對齊,成員之間可能加入填充(padding),整體大小可能大於成員大小的總和。

日文名稱: 構造体

「結構(struct)」出現在1領域的2道練習題中(C語言基礎等)。

這個名詞所屬的領域: C語言基礎

定義與使用方式

定義 struct point { int x; int y; }; 之後,就能以 struct point p = {1, 2}; 建立變數,並以 p.x、p.y 使用各成員。以 typedef 取別名,如 typedef struct { … } Point;,就能不寫 struct 而以 Point p; 宣告。結構之間可以用 = 整個指派,也能作為函式的引數或回傳值,但大型結構一般以指標傳遞。

在記憶體中的排列

成員依宣告順序,從位址小的一方開始放置。像 int 這種必須對齊到4位元組邊界的型別之前會加入填充,整個結構的大小也會進位到最嚴格對齊值的倍數。因此依 char、int、char 順序排列的結構,在 int 為4位元組的一般環境中是12位元組,把 int 放在前面則減為8位元組。

嵌入式與通訊上的注意事項

以結構表示周邊電路暫存器的排列很常見,但填充與位元欄位的位元順序可以因處理系統而異,未經確認就使用可能使位址錯開。若把通訊資料或儲存檔案的格式直接當作結構的記憶體內容處理,會因填充與端序的差異而與其他環境不相容,因此常改為逐位元組組合資料。

常見問題

結構與陣列有什麼不同?

陣列是排列相同型別的元素,以索引選取元素。結構是整合可為不同型別的成員,以名稱選取成員。也能組合使用,例如結構的陣列,或以陣列作為成員的結構。

為什麼需要用 sizeof 確認結構的大小?

成員之間或最後加入的填充量,會依型別大小與對齊規則(ABI)而變,只把成員大小相加並不能得到正確的大小。用 malloc 配置結構的區域或寫入檔案時,要以 sizeof(struct 名稱) 求出實際大小。

解析中的「結構(struct)」

出現「結構(struct)」的題目(2題)

  1. 假設是 char 為1位元組、int 為4位元組,且 int 放在4的倍數位址上的一般環境。執行上方程式碼時的輸出,下列何者正確?
  2. 標頭檔 sensor.h 寫成上方的樣子。#ifndef、#define、#endif 這3行的目的,下列何者正確?

出現這個名詞的比較

相關名詞

對齊與填充 陣列 巨集(macro) 未定義行為 位元欄位(bit-field) 函式指標 前置處理器 指標(pointer) 記憶體洩漏 動態記憶體配置

前往名詞解釋列表