C語言的記憶體管理 動態記憶體分配

2021-08-20 13:07:34 字數 2667 閱讀 2709

c語言中的一切操作都是基於記憶體的

變數和陣列都是記憶體的別名

記憶體分配由編譯器在編譯期間決定

定義陣列的時候必須指定陣列長度

陣列長度是在編譯器就必須確定的

需求:程式執行的過程中,可能需要使用一些額外的記憶體空間

malloc和free用於執行動態記憶體分配和釋放

malloc所分配的是一塊連續的記憶體

malloc以位元組為單位,並且不帶任何型別資訊

free用於將動態記憶體歸還系統

malloc和free是庫函式,而不是系統呼叫malloc實際分配的記憶體可能會比請求的多

不能依賴於不同平台下的malloc行為

當請求的動態記憶體無法滿足時,malloc返回null

當free的引數為null時,函式直接返回。

思考:malloc(0);將返回什麼?

示例**:記憶體洩露檢測模組

/* --------- main.c --------- */

#include

#include "mleak.h"

void f()

int main()

/* --------- 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 line)}}

return ret;

}void freeex(void* p)}}

}void print_leak_info()

}}/* --------- 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

輸出結果:

potential memory leak info:

address: 0x85ed018, size:100, location: 38-1.c:6

malloc的同胞兄弟

void* calloc(size_t num, size_t size);

void* realloc(void* pointer, size_t new_size);

calloc的引數代表所返回記憶體的型別資訊

calloc會將返回的記憶體初始化為0realloc用於修改乙個原先已經分配的記憶體塊大小

在使用realloc之後應該使用其返回值當pointer的第乙個引數為null時,等價於malloc

示例**:calloc和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] = 0, ps[0] = 0

pi[1] = 0, ps[1] = 0

pi[2] = 0, ps[2] = 0

pi[3] = 0, ps[3] = 0

pi[4] = 0, ps[4] = 0

before: pi = 0x8b0d008

after: pi = 0x8b0d030

pi[0] = 0

pi[1] = 0

pi[2] = 0

pi[3] = 0

pi[4] = 0

pi[5] = 0

pi[6] = 0

pi[7] = 0

pi[8] = 0

pi[9] = 0

C語言記憶體管理 動態記憶體分配

一 介紹 一般定義陣列是要給固定的長度,當我們不知道輸入的長度是多少的時候,怎麼辦 例如 需求現在有乙個 本儲存,本中聯絡人並不知道有多少,一次定義1000個長度會占用記憶體,定義太小又會導致儲存不夠 c語音給了一種特殊的方式,動態記憶體分配 二 函式介紹 標頭檔案 include 1 void m...

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

C語言動態記憶體分配

c語言動態記憶體分配 動態資料結構可以在執行時靈活新增 刪除或重排資料項。在執行時分配記憶體空間的過程稱為動態記憶體分配。記憶體分配函式如下 malloc 分配所需的位元組大小,並返回指向所分配空間的第乙個位元組的指標 calloc 為元素陣列分配空間,並初始化為零,然後返回指向該記憶體的指標 fr...