今天閒著沒事去敲一些簡單的程式設計題來複習複習,結果在用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...