一些關於關於記憶體分配—malloc()和free()的基本知識。
有關指標
指標是用來存放記憶體位址的,分型別的原因是,指標變數儲存的是乙個記憶體空間的首位址(第乙個位元組的位址)。但這個空間占用的位元組和存放的數的型別,是由指標的型別來表明的。系統根據指標型別取相應連續的記憶體作為乙個資料。
儲存型別和動態記憶體分配
程式將可用的記憶體分成3塊,一部分供具有外部鏈結、內部鏈結和無鏈結的靜態變數使用,一部分供自動變數使用,一部分供動態記憶體分配。
靜態儲存類別所用的記憶體是在編譯的時候確定的,該類別的變數在程式開始執行的時候建立,在程式結束是被銷毀。
自動儲存型別的變數是在程式進入變數定義的塊時存在,在程式離開塊時消失,隨著程式呼叫函式和函式結束,自動變數所用的記憶體數量相應變化。這部分記憶體通常用作棧來處理,新建立的變數按順序加入記憶體,然後以相反的順序銷毀。
動態分配的內存在呼叫malloc()或相關函式使存在,在free()後釋放。這部分記憶體由程式設計師管理,可在函式間跨越建立銷毀。使用動態記憶體比使用棧記憶體慢。
malloc函式
malloc函式的作用就是從記憶體中申請分配指定位元組大小的記憶體空間。
例:p=(int*)malloc(sizeof(int));
malloc函式的返回型別是void*型別的,標識未確定型別的指標。在c/c++中,void*型別可以強制轉換為任何其他型別的指標。上例中將其強制轉換為整形指標,以告訴計算機這裡的4個位元組是乙個整體用來存放整數。
malloc函式可以宣告變長陣列,用變數表示式表示陣列的維度,用陣列名訪問陣列元素,或者宣告乙個指標,呼叫malloc函式,將其返回賦值給指標,使用指標訪問元素,指標可以是靜態或者動態的。用這兩種方式可以建立動態陣列。在程式執行的時候選擇陣列的大小和分配記憶體。malloc函式分配記憶體失敗時,返回空指標,這時可以呼叫exit()退出。
free函式
malloc函式和free函式要配套使用。free函式的引數是之前malloc()返回的位址,是乙個指向malloc分配的一塊記憶體,釋放之前malloc分配的位址。整個過程也就是malloc和free管理著乙個記憶體池,每次呼叫malloc分配記憶體給程式使用,呼叫free把記憶體歸還給記憶體池。其他方式分配的記憶體不能用free釋放。
使用free函式是有必要的,若在呼叫函式的時候,使用malloc函式分配了記憶體給指標,而沒有用free時,當函式結束時,自動變數的指標消失,但之前指標指向的記憶體還存在,但此時指標已銷毀,無法再訪問這塊記憶體。就是記憶體洩漏。
malloc和free的原型都在stdlib.h標頭檔案中,也有calloc函式分配記憶體。
記憶體分配(malloc 和free )
c語言的乙個特性是接近底層,對於硬體的控制能力比其他高階動態語言要強。同時,c語言賦予程式設計師更大的自由度,更信任程式設計師。在記憶體的分配與釋放上,我們知道非靜態變數 塊作用域,無鏈結,自動生存期 在程式進入到變數定義所在的地方 塊或函式內 時分配記憶體,在離開塊作用域時釋放。對於靜態變數,在程...
動態記憶體分配 malloc 和free
1 通過查詢gcc的man手冊,我們可以看到malloc的函式原型 void malloc size t size 分配長度為size位元組的記憶體塊 1 返回值是void指標,void 表示未確定型別的指標,void 可以指向任何型別的資料,指標指向的型別是不確定的,這個指標在需要的時候可以被強制...
Malloc與free記憶體的分配和釋放
malloc函式 用於分配記憶體 例 double ptd ptd double malloc 30 sizeof double 這個例子 請求 30個double型別值得空間,並且把ptd指向該空間所在位置,注意ptd是作為指向乙個double型別值得指標宣告,而不是指向30個double型別值得...