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

C語言 free() 釋放記憶體後仍能列印內容的原因

     編輯:C 語言問答

釋放記憶體 ≠ 清除資料

程式碼片段:

char *str = malloc(100);
strcpy(str, "hello");
free(str);
printf("%s", str); // 輸出 "hello" —— 未定義行為

現象解釋

  • free(str) 僅將記憶體區塊標記為「可重複使用」,並 不會清零或覆寫 原有資料。
  • 指標 str 仍指向原位址(成為「懸空指標」),資料暫時殘留,故 printf 偶爾能讀到舊值。
  • 這屬於 未定義行為 (UB):下一次 malloc、系統整理堆疊、或最佳化編譯器假設指標有效而移除存取,皆可能導致崩潰或輸出亂碼。

正確做法

free(str);
str = NULL; // 避免誤用懸空指標

進階驗證

啟用 AddressSanitizer (-fsanitize=address) 或 Valgrind 即可偵測「use-after-free」錯誤。

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