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

C 語言結構體指標遞增與輸出行為分析

     編輯:程式設計綜合問答

代碼邏輯追蹤

per_infor_t *p = stu;
while(p < stu + SIZE_STU) p++; // p 指向 stu[4] (越界一位)
printf("%s\n", (p++)->name);    // 先取 stu[4].name (垃圾值),再 p++

關鍵點

  1. stu + SIZE_STU 等價 &stu[4],指向陣列尾後一個位置
  2. 迴圈結束條件 p < stu+4,故 p 最終指向 stu[4](無效記憶體)
  3. (p++)->name 後置遞增:先解引用當前 p,再遞增

未定義行為風險

存取 stu[4] 屬於緩衝區越界,可能輸出亂碼、崩潰或看似正常(釋放版)。

修正建議

// 正確遍歷並輸出最後一個有效元素
per_infor_t *p = stu;
while(p < stu + SIZE_STU - 1) p++; // 停在 stu[3]
printf("%s\n", p->name); // 輸出 "alan"

// 或使用索引
printf("%s\n", stu[SIZE_STU - 1].name);

指標運算務必確保在有效範圍內,調試時開啟 AddressSanitizer (-fsanitize=address) 捕獲越界。

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