malloc 之後free報錯的原因 詳細解析

2021-10-10 08:00:53 字數 2228 閱讀 8357

今天閒著沒事去敲一些簡單的程式設計題來複習複習,結果在用free

()函式的時候報錯了。

由此引發了我的思考。

題目如下:

輸入一串字元,以「?」結束。統計其中字母個數,數字個數,其它符號個數。

例:輸入

ab123!?

輸出 letters=2

digits=3

others=1

解題思路:

按照我平常思路的話用乙個char陣列,來儲存字串,再用判斷語句統計。

但是畢竟是來複習的,想著好久沒有用malloc()函式,於是就想著用動態分配記憶體的方法來解決它。

我的**如下:

#include

#include

void

print

(char

*p);

intmain

(void

)void

print

(char

*p)if((

*p)>=

'0'&&

(*p)

<=

'9')

o++; p++;}

printf

("letters=%d\ndigits=%d\nothers=%d\n"

,l,d,o)

;free

(p);

}

看一下我上面的**,感覺是不是好像沒啥大問題。

我也是這樣想的,但是結果是報錯了。

看到報錯了。於是,我開始了一步步的分析一下究竟是**的問題。

最後發現是free

()函式的問題。

當我把free

()函式刪除後,程式就沒有報錯了,程式正常執行。

如下圖:

這不禁讓我陷入了思考,為啥這樣就好了。為啥一用free

()函式就報錯呢?

()函式報錯的例子後,頓時有了思路知道了問題所在。

我們先看一下乙個例子後,再來思考我們的問題。

例子:

#include

void

main()

上面這個**也是報錯的。問題的根源也是free

()函式。

當malloc

()之後,test就指向了malloc

()函式分配的乙個記憶體塊。

當test=

"123"

;之後,test就指向了123這個常量的位址,而不再是malloc

()函式分配的記憶體塊的位址。

當我們free

()之後就引發了報錯。

通過上面這個例子,我們再來分析現在我們這個**的問題。

我們判斷的時候迴圈執行了好幾次的p++

,這時的位址早已不是當初malloc

()分配的記憶體塊的初始位址。

由此引發了free

()報錯的問題。

我們的猜想對不對呢?

下面到了測試猜想的環節

思路: 再定義乙個 char

*s,讓其再malloc給p分配記憶體空間之後,s指向p的位址。

這時s就指向了這個記憶體塊的首位址,最後free

(s)看會不會報錯。

如果不會報錯,那麼猜想是正確的。

如果報錯,那麼猜想就有問題。

直接上圖 看測試結果:

沒有問題,看來猜想是對的,問題解決。
指向malloc申請的記憶體的指標,在運用過程中指標的指向千萬不要改變,

就算要改變也要用另外乙個變數儲存malloc申請的記憶體的位址,最後用free釋放,否則會導致記憶體洩露。

malloc和free的實現

被人問到malloc和free的實現問題。我們知道malloc的呼叫形式如 type p type malloc n sizeof type free的呼叫形式如 free p 好了,問題來了,free函式,我們只給傳入乙個指標,沒有傳入記憶體塊的大小n,那麼編譯器怎麼知道要釋放多少位元組的記憶體,...

malloc與free的原理

malloc free用於內部資料型別動態的申請記憶體及釋放記憶體。1.malloc 與 free的原理 malloc 函式利用系統呼叫來完成對記憶體的申請分配,系統將可用的記憶體塊連線成為乙個長長的列表稱為空閒鍊錶,呼叫malloc時,將遍歷鍊錶,找到滿足申請空間的空閒鍊錶塊,然後將鍊錶塊分為兩個...

malloc和free的區別

1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc f...