1. 程式人生 > >malloc後free出錯 (釋放了錯誤的地址空間)

malloc後free出錯 (釋放了錯誤的地址空間)

malloc後free出錯

問題

程式malloc後,free時 core dump
源程式如下(舉例):

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *buf;
    buf = (int *)malloc(sizeof(int));
    buf++;
    free(buf);
    return 0;
}

出錯資訊如下:
在這裡插入圖片描述

原因分析

指標 buf 的地址在 malloc 之後地址被改變,導致 free 時 free的不是以前的空間,因此出錯。
上面舉例很簡單,意圖也很明顯,buf++ 就是為了說明 buff 地址被改變。
我們日常程式設計中遇到的問題肯定不會這麼明顯,但是程式中很可能就出現了類似的錯誤。比如在取地址時為了取到後面資料,對地址進行了改變。因此才會出現上述錯誤。
這種問題只需要 free 正確的地址就可。

解決方法

程式修改如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *buf;
    int *buf_src = NULL;
    buf = (int *)malloc(sizeof(int));
    buf_src = buf;
    buf++;
    free(buf_src);
    return 0;
}

增加一個指標變數 buf_src,用於儲存原指標 buf 的地址,
現在 free(buf_src),既是對 malloc 時 指標 buf 地址空間的釋放。