首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言結構體指針 typedef 陷阱:Book_Node 已是指針類型,printf 參數錯誤導致輸出異常

     編輯:程式設計疑難解答

代碼片段與誤區

typedef struct book_node {
    struct book data;
    struct book_node *next;
} Book_Node, *Book_Link;  // Book_Node 是結構體類型,Book_Link 才是指針類型

// 使用時
Book_Node *p;  // 此處 p 是「指向結構體的指針」,正確
// 若寫成 Book_Link p; 則 p 直接是指針,無需再加 *

printf 參數錯誤分析

printf("%s %d", p->data.name, p->data.price); // 正確:兩個參數匹配兩個佔位符
// 若寫成
printf("%s", p->data.name, p->data.price);    // 錯誤:格式字符串只有 1 個 %s,但傳了 2 參數
// 或
printf("%s %d", p->data.name);                // 錯誤:缺參數,輸出亂碼/崩潰

修正要點

  1. 搞清 typedef 別名語義:
    • Book_Node = struct book_node(值類型)
    • Book_Link = struct book_node*(指針類型)
    • 聲明變量時:Book_Node node; 或 Book_Link p;(等價於 Book_Node *p;)
  2. printf 格式字符串與參數嚴格對應:%s 對 char*,%d 對 int,數量、順序、類型必須一一匹配。
  3. 開啟編譯器警告:gcc -Wall -Wextra -Wformat=2 可捕獲格式字符串不匹配。

完整正確示例

typedef struct book {
    char name[50];
    int price;
} Book;

typedef struct book_node {
    Book data;
    struct book_node *next;
} Book_Node, *Book_Link;

void print_list(Book_Link head) {
    for (Book_Link p = head; p != NULL; p = p->next) {
        printf("書名: %-20s 價格: %5d\n", p->data.name, p->data.price);
    }
}

int main() {
    Book_Node n1 = {{"C Primer Plus", 89}, NULL};
    Book_Node n2 = {{"TCP/IP Illustrated", 120}, NULL};
    n1.next = &n2;
    print_list(&n1);
    return 0;
}

總結口訣

「typedef 別名看定義:結構體名是值,帶星號的是指針;printf 參數對格式,多一個少一個都不行。」

理清 Book_Node vs Book_Link 的類型本質,配上 -Wformat 守門,結構體鏈表輸出零失誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved