iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
Software Development

用leetcode系統化學習C語言系列 第 14

指標(pointer)與動態記憶體(malloc/calloc/realloc/free)常見錯誤

  • 分享至 

  • xImage
  •  

1.不能回傳區域變數的指標(重要!)
錯誤範例:
int* bad() {
int local[10]; // 在 stack 上
return local; // 錯:local 會在函式結束被釋放
}
原因:local 在函式結束後不再存在(stack frame 被回收),回傳的指標會變成 dangling pointer,使用會造成未定義行為。正確做法是把資料放到 heap(malloc)或讓呼叫端提供 buffer。

2.free()常見錯誤與防禦式寫法
每個 malloc/calloc/realloc 成功後,最後一定要 free
常見 bug:
Memory leak(忘記 free)→ 長時間或大量分配會耗盡記憶體
Use-after-free(free 後還存取)→ 未定義行為,很難 debug
Double free(同一指標 free 兩次)→ 嚴重錯誤。

防禦寫法:
free(ptr);
ptr = NULL; // 防止 use-after-free 與 double-free(再次 free(NULL) 是安全的)

3.犯錯實例與如何避免
忘記檢查 malloc 回傳 NULL:在記憶體不足或系統限制下會失敗
忘記 free:長時間執行的程式會累積記憶體泄漏。
返回指向局部變數的指標:會造成 undefined behavior
sizeof 寫錯(malloc(n * sizeof(int)) vs malloc(n * sizeof *arr)):推薦後者
realloc 直接覆寫原指標(應先用 tmp 保存,避免失敗時遺失原指標)
越界存取(off-by-one):alloc n 個元素時,索引上限是 n-1。


上一篇
指標(pointer)與動態記憶體(malloc/calloc/realloc/free)範例
下一篇
C指標統整
系列文
用leetcode系統化學習C語言15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言