struct Student {
int number;
char name[10];
float score;
}; // 分號不可省
// 方式1: 先定義類型,再聲明變量
struct Student st1, st2, st3;
// 方式2: 定義類型同時聲明變量
struct Student {
int number;
char name[10];
float score;
} st1, st2, st3;
// 方式3: 定義並初始化
struct Student st1 = {101, "wang", 87.5};
struct Student stu[50] = {
{101, "wang", 87.5},
{102, "li", 90},
// ...
};
struct Student *p; // 方式1: 需先見類型定義
struct Student { ... } *p; // 方式2: 定義類型同時聲明指針
struct Student st1 = {101, "wang", 87.5};
struct Student *p = &st1;
// 訪問成員三種等價形式
p->number; // 推薦:箭頭運算符
(*p).number; // 解引用後用點運算符
st1.number; // 直接用變量
struct Student stu[10] = {...};
struct Student *p = stu; // 指向首元素
for (; p < stu + 10; p++) {
printf("%d, %s", p->number, p->name);
}
p++ 自動按 sizeof(struct Student) 步進,體現指標運算的類型感知特性。
| 函數 | 原型 | 用途 |
|---|---|---|
malloc | void* malloc(size_t size) | 分配 size 字節,內容未初始化 |
calloc | void* calloc(size_t n, size_t size) | 分配 n 個 size 字節塊,自動清零 |
realloc | void* realloc(void* ptr, size_t size) | 調整已分配塊大小,可能移動內存 |
free | void free(void* ptr) | 釋放 malloc/calloc/realloc 分配的內存 |
struct Student *p = (struct Student*)malloc(sizeof(struct Student)); if (!p) exit(1); // 檢查分配失敗 // 分配數組 struct Student *arr = (struct Student*)calloc(100, sizeof(struct Student)); free(p); // 用完必須釋放,防止內存洩漏
struct Student {
char *name;
struct Student *next; // 指向下一節點
};
struct Student *create_list(int n) {
struct Student *head = NULL, *tail = NULL, *p = NULL;
for (int i = 0; i < n; i++) {
p = (struct Student*)malloc(sizeof(struct Student));
if (!p) exit(1);
p->name = NULL; // 這裡簡化,實際應分配字符串空間
p->next = NULL;
if (i == 0) head = tail = p;
else { tail->next = p; tail = p; }
}
return head;
}
void traverse(struct Student *head) {
for (struct Student *p = head; p; p = p->next)
printf("%s\n", p->name);
}
void free_list(struct Student *head) {
struct Student *p = head, *tmp;
while (p) {
tmp = p->next;
free(p->name); // 先釋放成員動態內存
free(p);
p = tmp;
}
}
sizeof 可能大於成員大小之和。可用 #pragma pack 或屬性控制。char data[]; 配合 malloc(sizeof(Struct) + extra) 實現變長結構。free 後指針不自動置 NULL,建議 free(p), p = NULL; 避免野指針。結構體是 C 語言構建複雜數據模型的基石。熟練掌握定義、指針操作、動態內存管理、鏈表等鏈式結構實現,是系統級編程、數據結構構建的核心技能。