需求:
程式執行的過程中,可能需要使用一些額外的記憶體空間
void* malloc(size_t size);
void free(void* pointer);
malloc 是庫函式,不同的作業系統對記憶體的管理可能是是不同的。例,作業系統為了高效,記憶體池中空閒記憶體總是為4位元組整數倍。當通過malloc函式動態申請3位元組,存在可能實際分配為4位元組。
這造成malloc實際分配的記憶體可能請求的多。同時,為了提高程式的可以移植性,不能依賴於不同平台下的malloc行為。
#include #include int main()
輸出:【無警告,無錯誤】
0x9616008
發生了什麼?
malloc(0) 申請成功,返回申請記憶體首位址,只不過記憶體長度為0。
會。因為malloc申請得到的記憶體空間往往比實際申請得大。現代作業系統一般會4位元組對齊,將導致malloc(0, 1, 2, 3) 都可能獲得得實際記憶體空間為4。而不是0,1,2,3,這將導致記憶體洩漏。因此,malloc 和 free 必須成對出現。
mleak.h
#ifndef _mleak_h_
#define _mleak_h_
#include #define malloc(n) mallocex(n, __file__, __line__)
#define free(p) freeex(p)
void* mallocex(size_t n, const char* file, const line);
void freeex(void* p);
void print_leak_info();
#endif
mleak.c
#include "mleak.h"
#define size 256
/* 動態記憶體申請引數結構體 */
typedef struct
mitem;
static mitem g_record[size]; /* 記錄動態記憶體申請的操作 */
void* mallocex(size_t n, const char* file, const int line)
int main()
輸出:
address: 0x97a8018, size:12, location: test.c:12
address: 0x97a8028, size:100, location: test.c:6
注意:以上檔案沒有做臨界資源保護(多執行緒程式設計),在實際專案中需要進行再擴充套件。
realloc 用於修改乙個原先已經分配的記憶體塊大小
#include #include #define size 5
int main()
printf("before: pi = %p\n", pi);
pi = (int*)realloc(pi, 2 * size * sizeof(int));
printf("after: pi = %p\n", pi);
for(i=0; i<10; i++)
free(pi);
free(ps);
return 0;
}
輸出:
pi[0] = -842150451, ps[0] = 0
pi[1] = -842150451, ps[1] = 0
pi[2] = -842150451, ps[2] = 0
pi[3] = -842150451, ps[3] = 0
pi[4] = -842150451, ps[4] = 0
before: pi = 01136db0
after: pi = 01136db0
pi[0] = -842150451
pi[1] = -842150451
pi[2] = -842150451
pi[3] = -842150451
pi[4] = -842150451
pi[5] = -842150451
pi[6] = -842150451
pi[7] = -842150451
pi[8] = -842150451
pi[9] = -842150451
分析:pi, mallo申請記憶體中的值為隨機值
pi, realloc之後,指向的位址將發生改變。擴大之後的部分為隨機值,重合的部分為原始值
c語言動態記憶體分配 C 動態記憶體分配
動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...
c 動態記憶體分配
c語言中提供的動態記憶體分配為了解決陣列的靜態的分配方式的問題 即陣列大小必須在定義時指定,程式在執行時不能動態改變陣列的大小 在標準庫中提供了三個動態記憶體分配的函式供程式呼叫,下面將分別對這三個函式進行介紹 1.void malloc size t size malloc 在分配一段連續的記憶體...
C 動態記憶體分配
c 動態記憶體分配 c c 定義了4個記憶體區間 區,全域性變數與靜態變數區,區域性變數區即棧區,動態儲存區,即堆 heap 區或自由儲存區 free store 堆的概念 通常定義變數 或物件 編譯器在編譯時都可以根據該變數 或物件 的型別知道所需記憶體空間的大小,從而系統在適當的時候為他們分配確...