程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 對malloc使用的一點新理解,malloc使用理解

對malloc使用的一點新理解,malloc使用理解

編輯:關於C語言

對malloc使用的一點新理解,malloc使用理解


昨日在子函數中用malloc申請內存使用後,意外發現在free的時候出現異常錯誤,後經檢查發現原來是實際使用時指針長度超過了申請的范圍。

現總結一些使用malloc時要注意的地方:

1,不要Free二次,配套使用。否則當free第一次的時候沒有問題,第二次的時候就是在free一個野指針了,程序也不知道你到底在free什麼東西。 2,不要跨進程分配和釋放;   
     不要free多次或0次;   
     注意判斷分配是否成功; 3,對於malloc()和free()需要注意的,補充一句,為了確保對於一個有效指針只free一次,所以應該在malloc返回失敗、free指針以後都因該把指針置空,而在free前應該判斷指針是否為空!只要按照這種方式去寫代碼應該是沒問題的!當指針置空後你愛怎麼free都沒事。 4,在一個函數裡邊malloc了一個指針,然後返回值是這個指針,也需要free。 5,指向malloc申請的堆內存的指針,在運用過程中千萬不要另付值,否則同樣導致內存洩露。比如我*p=(char*)malloc(sizeof(char)*100);然後我進行p++,再free(p);這樣是會出問題的。free()傳入的參數必須是內存段的頭指針,如果你給程序的東西不是牛頭不對馬嘴,它肯定要跟你鬧矛盾。 6,malloc後,實際使用時指針長度超過了你申請的范圍,當再去free時肯定出問題!其實很好理解,你申請了十塊大洋,你買不了十一塊大洋的東西。   其實這兩個函數用起來倒不是很難,也就是malloc()之後覺得用夠了就甩了它把它給free()了,舉個簡單例子:

 1 // Code...
 2 char *Ptr = NULL;
 3 Ptr = (char *)malloc(100 * sizeof(char));
 4 
 5 if (NULL == Ptr)
 6 {
 7 exit (1);
 8 }
 9 
10 gets(Ptr);
11 
12 // code...
13 
14 
15 free(Ptr);
16 
17 Ptr = NULL;
18 
19 // code...

 

最後貼上昨天在知乎給遇到相同問題的同學的解答:

https://www.zhihu.com/question/38970898/answer/125534251

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved