關於malloc函式後free記憶體空間的疑問

2021-06-19 02:25:46 字數 1491 閱讀 5139

(1)關於malloc函式後free記憶體空間的疑問

問題: 

malloc是開出記憶體空間。 

現在我寫了這麼一句: 

char *name; 

name=(char *)malloc(len*sizeof(char)); 

name指標是個char指標,指向乙個char資料,即只保留了乙個char資料的長度資訊.free的時候它如何知道開出的空間到底有多長? 

解答: 

(1)malloc是乙個庫函式,不是由作業系統提供的,絕大部分都是由編譯器提供的庫包自己實現的。malloc如何實現,依賴於不同的作業系統跟不同的c庫。 

比如,在linux上面,malloc是呼叫brk系統呼叫進行記憶體分配的,而在windows則是heapalloc等等類似的系統函式分配記憶體。 

一般c庫在初始化的時候都是一下子在堆中分配了一大部分記憶體,然後再根據自己的演算法對這些記憶體進行分配。至於free怎麼知道要free多少位元組。其實很簡單,因為每用malloc分配乙個記憶體塊,c庫就要記住你分配的多少位元組,一般情況下都是記在返回指標的前幾個位元組。 

(2)c庫記憶就是開闢額外的空間記錄分配記憶體的大小,開闢額外的空間去記錄分配記憶體的大小也只是乙個權宜之計,也只是c庫玩的一種把戲而已。微軟的c庫這麼做,gcc的c庫這麼做,但不代表其他所有編譯器的c庫都這麼做。所以,通俗的講,或者更一般的講,用c庫記憶更具有一般性。 

(3)比如char * buf1 = (char*)malloc (32);  

那麼buf1[-8]~ buf1[-1] 都是用來放管理資訊的!特別是在windows下程式設計是如此.  

buf1的管理結構(8bytes)  |  buf1真正可操作空間(32bytes)   |    下乙個空閒堆的管理結構(8bytes)|兩個雙鏈表指標(8bytes) 

↑                  ↑ 

free()根據這裡提供的      buf1真正指向這裡 

管理資訊來**記憶體 

(2)關於free()和malloc

#include#include#includevoid main()
結果只是world

請問一下這是為什麼?

------解決方案--------------------

free(sr)只是把sr指向的記憶體空間標識為可用,並且記憶體中的資料不會被清空,就像我們刪除硬碟上的檔案一樣,刪除操作只是把檔案所占用的塊標識為可用,並不會對內容進行清空,因此,檔案才能恢復。

回到正題,free(sr)後,sr此時仍然指向那塊記憶體,且內容不變,因此你再strcpy操作sr指向的記憶體空間在操作上是合法的(因為仍然屬於其程序內),只是,在邏輯上是錯誤的,非法的,危險的,因為此時,那塊記憶體可能已經被重新分配給了其他指標,而你通過strcpy擅自修改了其內容。

釋放記憶體嚴格的寫法應該是:

free(sr);

sr = null;

malloc函式和free函式

c語言中的動態記憶體分配函式malloc和free使用起來很靈活,但是也很容易導致錯誤,如果知道了malloc和free的實現原理,那麼,出錯的機會就很小了。malloc的實現原理 作業系統維護了乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶。呼叫malloc函式時,作業系統沿鍊錶尋找乙個大...

free函式和malloc函式

初學c和資料結構是對其很不明確,通過一些資料,稍微理解了,所以記下以後複習之用,如果有錯誤或者理解不當的情況請指正,不勝感激。一malloc和free函式 malloc函式 void malloc sizeof byte 向系統申請大小的空間,然後返回指向這個記憶體的指標。如果記憶體分配失敗,則返回...

malloc與free函式用法

在c裡,記憶體管理是通過專門的函式來實現。另外,為了相容各種程式語言,作業系統提供的介面通常是c 語言寫成的函式宣告 windows 本身也由c和組合語言寫成 1分配記憶體malloc函式 需要包含標頭檔案 include 函式宣告 函式原型 void malloc int size 說明 mall...