開心IT面試題 malloc和free用法

2021-06-19 17:06:47 字數 1463 閱讀 3669

c++面試題中另乙個大板塊——記憶體管理,主要有malloc(free)、new(delete)、calloc、realloc等。今天來說說malloc和free的用法。

1、標頭檔案

#include <

stdlib.h

> 有些編譯器需要#include ,在tc2.0中可以使用alloc.h標頭檔案

2、malloc()和free()的函式原型

void *malloc(unsigned int num_bytes);

該函式分配長度為num_bytes位元組的記憶體塊。

如果分配成功,則返回指向被分配記憶體的指標,否則返回空指標null。

void free(void *ptr);

該函式與malloc()函式配對使用,釋放malloc()函式申請的動態記憶體。

(如果ptr是null指標,那麼free對ptr無論操作多少次都不會出問題。如果ptr不是null指標,那麼free對ptr連續操作兩次就會導致程式執行出錯。)

3、malloc()和free()的使用舉例

char *ptr = null;//宣告乙個指向char的指標

ptr = (char *)malloc(sizeof(char));//使用malloc分配記憶體

if(ptr == null)

else

//ptr操作

free(ptr);//釋放掉使用的記憶體位址

ptr = null;

4、使用要點

a)申請了記憶體空間後,一定要檢查是否分配成功才使用。

b)當不再需求使用這塊記憶體時,一定要記得釋放.

c)對非空記憶體塊的釋放只能釋放一次

d)釋放後應該把指向這塊記憶體的指標指向null,防止後面的程式不小心使用了它。

5.工作機制

a)malloc()得到的記憶體空間是從堆裡面獲得的空間,也就是說函式返回指標是指向堆裡面的一塊記憶體。作業系統中有乙個記錄空閒記憶體位址的鍊錶。當作業系統收到程式的申請時,就會遍歷該鍊錶,然後就尋找第乙個空間大於所申請空間的堆結點,然後就將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。

b)什麼是堆?堆是大家共有的空間,分全域性堆和區域性堆。全域性堆主是所有沒有分配 的空間,區域性堆就是使用者分配的空間。堆在作業系統對程序初始化的時候分配,執行過程中也可以向系統要額外的堆,但是記得用完了要還給作業系統,要不然就是記憶體洩漏。

棧是由編譯器自動分配釋放,存放函式的引數值、區域性變數的值等。操作方式類似於資料結構中的棧。

堆一般由程式設計師分配釋放,若不釋放,程式結束時可能由os**。只是可能,並非一定,所以還是一定要記得釋放。這裡的堆與資料結構中的堆是兩回事,分配方式類似於鍊錶。

如果在函式裡申請了一塊記憶體,讓指標指向它。實際上,這個指標的位址是在棧上,但是它所指向的內容卻是在堆上面的。函式退出時,函式所在的棧被銷毀,指標也跟著銷毀,但是申請的內存在堆上,並沒有被銷毀。所以還要記得釋放!



開心IT面試題 希爾排序

1 基本思想 希爾排序又稱增量縮小排序,是對直接插入排序的一種改進,分組插入方法。先將序列按增量劃分為元素個數相同的若干組,使用直接插入排序法進行排序,然後不斷縮小增量直至為1,最後使用直接插入排序完成排序。2 假設待排序陣列為 2 6 1 5 3 8 9 4 增量取4 2和1 第一趟待排序陣列可分...

開心IT面試題 氣泡排序

1 基本思想 將陣列劃分為有序區和無序區,不斷通過交換將較大元素移至無序區尾。若在某一趟排序中未發生交換事件時,或無序區已全部排序完時,則排序完畢。2 最優情況 待排序陣列是正序 只用比較一次就行了。複雜度o n 最差情況 待排序陣列是逆序 要比較n 2次才行,複雜度o n 2 3 氣泡排序屬於穩定...

開心IT面試題 單鏈表排序 反轉

一 單鏈表排序 仿照基於陣列的氣泡排序演算法 node sorting linklist node node node result int temp 0 int len length linklist node result node for int j 0 j len j result resu...