在 C 語言開發中,結構體(struct)是組織複雜數據的基石。當結構體內部需要引用自身類型時,新手常犯的錯誤是直接嵌套結構體實例,導致編譯器無法確定記憶體大小,產生「無限遞迴」錯誤。本文將深入解析結構體指標與字串轉換的核心概念,並示範正確的自我引用寫法。
假設我們定義一個鏈結串列節點:
struct Node {
int data;
struct Node next; // 錯誤:直接包含自身實例
};
編譯器在計算 struct Node 大小時,發現需要先知道 struct Node 的大小,形成死循環。這就像試圖把一個箱子裝進它自己裡面,物理上不可能實現。
指標佔用固定大小(32 位系統 4 bytes,64 位系統 8 bytes),編譯器能立即確定大小:
struct Node {
int data;
struct Node *next; // 正確:指向自身類型的指標
};
這樣每個節點只存儲下一個節點的地址,形成動態鏈結結構。
結構體指標常用於字串處理函數,例如將結構體序列化為字串:
void struct_to_string(const struct Node *head, char *buffer, size_t buf_size) {
const struct Node *curr = head;
size_t offset = 0;
while (curr && offset < buf_size - 1) {
offset += snprintf(buffer + offset, buf_size - offset, "%d ", curr->data);
curr = curr->next;
}
buffer[offset] = '\0';
}
反向解析時,需動態分配節點並透過指標串聯:
struct Node *string_to_struct(const char *str) {
struct Node *head = NULL, *tail = NULL;
int val;
while (sscanf(str, "%d", &val) == 1) {
struct Node *new_node = malloc(sizeof(struct Node));
new_node->data = val;
new_node->next = NULL;
if (!head) head = tail = new_node;
else {
tail->next = new_node;
tail = new_node;
}
// 移動字串指標到下一個數字
while (*str && *str != ' ') str++;
while (*str == ' ') str++;
}
return head;
}
free() 釋放,建議編寫專門的銷毀函數。掌握「結構體內部引用自身必須用指標」是 C 語言進階的關鍵門檻。結合字串轉換技巧,可實現靈活的數據序列化與反序列化,為檔案存儲、網路傳輸打下基礎。記住:指標雖小,乾坤大,善用指標才能駕馭複雜數據結構。