結構體 將不同類型的變量組合為單一實體,是 C 語言構建複雜數據模型的基石。每個成員擁有獨立名稱與內存位置,同時存在(與聯合體對比)。
struct Person {
char name[20];
int age;
float salary;
} p1, p2; // 直接定義兩個變量
struct Person { /* ... */ }; // 聲明標籤 Person
struct Person p1, p2; // 定義變量
struct Person arr[100]; // 結構體數組
struct {
char name[20];
int age;
} p1, p2; // 無法在別處復用此類型
typedef struct {
char name[20];
int age;
} Person; // 現在 Person 是類型別名
Person p1, p2; // 直接使用,無需 struct 關鍵字
struct Person p = {"Alice", 25, 5000.0f};
printf("Name: %s, Age: %d\n", p.name, p.age);
p.salary += 1000;
struct Person *ptr = &p;
printf("%s\n", ptr->name); // 等價於 (*ptr).name
ptr->age++;
p1 == p2 非法),需逐成員比較或 memcmp(注意填充字節)。struct Student {
char name[20];
int id;
float gpa;
} class[50];
// 初始化
struct Student class[3] = {
{"Alice", 1001, 3.8},
{"Bob", 1002, 3.5},
{"Carol", 1003, 3.9}
};
// 遍歷
for (int i = 0; i < 3; i++) {
printf("%s: %.2f\n", class[i].name, class[i].gpa);
}
struct Node *p = malloc(sizeof(struct Node));
if (!p) return NULL;
p->data = 10;
p->next = NULL;
struct Student *ptr = class; // 指向首元素
ptr++; // 移動到下一個 Student
printf("%s\n", ptr->name);
struct ListNode {
int data;
struct ListNode *next; // 必須用 struct ListNode*,不可用 typedef 別名(聲明未完成)
};
struct Flags {
unsigned int ready : 1;
unsigned int error : 1;
unsigned int mode : 2; // 0-3
unsigned int reserved : 28;
} flags;
flags.ready = 1;
if (flags.error) handleError();
應用:硬件寄存器映射、網絡協議頭、壓縮標誌存儲。
struct Buffer {
size_t len;
char data[]; // 最後一個成員,無大小
};
struct Buffer *buf = malloc(sizeof(struct Buffer) + 100);
buf->len = 100;
// buf->data 可用 100 字節
替代傳統「結構體 + 指針 + 額外 malloc」模式,單次分配,局部性更好。
struct A { char c; int i; }; // 大小通常 8:c + 3填充 + i
struct B { int i; char c; }; // 大小通常 8:i + c + 3填充
// 優化:按類型大小降序排列成員,減少填充
| 錯誤 | 後果 | 修正 |
|---|---|---|
忘記分號結尾 } | 語法錯誤,誤導後續聲明 | 習慣加分號 |
| 自引用用 typedef 名 | 編譯錯誤 | 用 struct Tag* |
| 結構體指針未初始化 | 野指針崩潰 | 分配後檢查 NULL |
| 柔性數組非最後成員 | 編譯錯誤 | 放在結尾 |
| 直接比較結構體 | 編譯錯誤 | 逐成員或 memcmp |
結構體是 C 語言數據建模的核心工具。從基本定義到位域、柔性數組、對齊優化,掌握其記憶體佈局與操作語義,能編寫出高效、清晰、可維護的系統級代碼。
extern 關鍵字詳解:跨文件變量聲明與 const 變量鏈接特性
ASP.NET 實作支援斷點續傳 (Range Requests) 的檔案下載處理器
經典與現代融合:MFC專案整合.NET Framework托管擴展與控件宿主完整指南
C標準庫函數速查手冊(D 開頭):delay/delline/detectgraph/difftime/disable/div/dosexterr/dostounix/drawpoly/dup/dup2