運行時觸發 CRT detected that the application wrote to memory after end of heap buffer,刪除 DeleteDeath 中的 free(deletePeople) 即不報錯,但會導致內存洩漏。
malloc 分配大小錯誤代碼中:
footer = (ListNode *)malloc(sizeof(LinkList)); // 錯誤:sizeof(LinkList) 是指針大小(4/8 字節)
LinkList 是 ListNode*,sizeof(LinkList) 返回指針大小,遠小於 sizeof(ListNode),導致寫入 footer->name 時越界破壞堆元數據,隨後 free 觸發崩潰。
malloc(sizeof(ListNode))。next 指向頭節點,並返回正確頭指針。next 再 free。// InitRing 中
footer = (ListNode *)malloc(sizeof(ListNode)); // 修正這裡
// ...
footer->next = linklist; // 閉環
return linklist; // 返回頭節點
// DeleteDeath 中
for (j = 1; j <= countOffLimits - 1; j++) // 修正步進邏輯
slider = slider->next;
deletePeople = slider->next;
slider->next = deletePeople->next;
free(deletePeople); // 現在安全
malloc(sizeof(*ptr)) 習慣,避免類型變更導致大小錯誤。NULL,防止二次釋放。修正分配大小與指針邏輯後,程序可穩定運行,正確實現約瑟夫環問題。