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

C 語言 malloc 死循環導致程式退出:記憶體耗盡而非寫入 0 錯誤

     編輯:程式設計疑難解答

代碼分析

char *p;
while (1) {
    p = malloc(1);
    *p = 0;
}

執行流程

  1. 每次迴圈申請 1 byte,寫入 0。
  2. 未釋放記憶體(無 free(p)),造成嚴重記憶體洩漏。
  3. 當堆耗盡,malloc 返回 NULL。
  4. 下一行 *p = 0 解引用空指標 → **段錯誤** 退出。

驗證方法

while (1) {
    p = malloc(1);
    if (p == NULL) {
        fprintf(stderr, "malloc 失敗,記憶體耗盡\n");
        break;
    }
    *p = 0;
}

輸出確認會印出錯誤訊息而非直接崩潰。

正確寫法

char *p = malloc(1);
if (p) {
    *p = 0;
    free(p); // 用完釋放
}

延伸知識

  • malloc(0) 行為實現定義(可能返回 NULL 或唯一指標),不應依賴。
  • 大量小塊分配極易產生堆碎片,實際開發用記憶體池或 realloc 擴大塊。
  • 工具 valgrind --leak-check=full 可檢測洩漏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved