per_infor_t *p = stu;
while(p < stu + SIZE_STU) p++; // p 指向 stu[4] (越界一位)
printf("%s\n", (p++)->name); // 先取 stu[4].name (垃圾值),再 p++
stu + SIZE_STU 等價 &stu[4],指向陣列尾後一個位置p < stu+4,故 p 最終指向 stu[4](無效記憶體)(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) 捕獲越界。