動態記憶體管理

2021-09-11 22:09:14 字數 2430 閱讀 9532

int val = 20;//在棧空間上開闢四個位元組

char arr[10] = ;//在棧空間上開闢10個位元組的連續空間

上邊**有兩個特點:

1.開闢空間的大小是固定的。

2.陣列在宣告的時候,必須是指定陣列的長度,它所需要的內存在編譯時分配。

但是對於空間的需求,不僅僅是上述的情況。有時候我們需要的空間大小在程式執行的時候才能知道,那陣列的編 譯時開闢空間的方式就不能滿足了。 這時候就只能試試動態存開闢了。

void* malloc(size_t size)
這個函式向記憶體申請了一塊連續可用的空間,並且返回這塊空間的指標

1.如果開闢成功,則返回乙個指向開闢好空間的指標

2.如果開闢失敗,則返回乙個null指標,因此malloc的返回值一定要做檢查

3.返回值的型別是== void*== ,所以malloc函式並不知道開闢空間的型別,具體在使用的時候使用者自己來決定。

4.如果引數 size 為0,malloc的行為是標準是未定義的,取決於編譯器。

c語言提供了另外乙個函式free,專門是用來做動態記憶體的釋放和**的,函式原型如下:

void free(void* ptr)
free函式用來釋放動態開闢的記憶體。

如果引數 ptr 指向的空間不是動態開闢的,那free函式的行為是未定義的。

如果引數 ptr 是null指標,則函式什麼事都不做。

malloc和free都宣告在 stdlib.h 標頭檔案中。舉個例子:

#includeint main()

; //**2

int* ptr = null;

ptr = (int*)malloc(num*sizeof(int));

if (ptr != null)//判斷ptr指標是否為空 }

free(ptr);//釋放ptr所指向的動態記憶體

ptr = null;//是否有必要

return 0;

}

c語言還提供了乙個函式叫 calloc , calloc 函式也用來動態記憶體分配。原型如下:

void* calloc(size_t num, size_t size);
1.函式的能是為 num 個大小為 size 的元素開闢一塊空間,並且把空間的每個位元組初始化為0。

2.與函式 malloc 的區別只在於 calloc 會在返回位址之前把申請的空間的每個位元組初始化為全0。 舉個例子:

#include#includeint main()

free(p);

p = null;

return 0;

}

1.realloc函式的出現讓動態記憶體管理更加靈活。

2.有時會我們發現過去申請的空間太小了,有時候我們又會覺得申請的空間過大了,那為了合理的時候記憶體, 我們一定會對記憶體的大小做靈活的調整。那 realloc 函式就可以做到對動態開闢記憶體大小的調整。 函式原型 如下:

void* realloc(void* ptr, size_t size)
1.size調整之後新大小

2.返回值為調整之後的記憶體起始位置。

3.這個函式調整原記憶體空間大小的基礎上,還會將原來記憶體中的資料移動到 新 的空間。

4.realloc在調整記憶體空間的是存在兩種情況:

情況1:原有空間之後有足夠大的空間

情況2:原有空間之後沒有足夠大的空間

情況1 當是情況1 的時候,要擴充套件記憶體就直接原有記憶體之後直接追加空間,原來空間的資料不發生變化。 情況2 當 是情況2 的時候,原有空間之後沒有足夠多的空間時,擴充套件的方法是:在堆空間上另找乙個合適大小的連續空間來 使用。這樣函式返回的是乙個新的記憶體位址。 由於上述的兩種情況,realloc函式的使用就要注意一些。

void test()

void test()

for (i = 0; i <= 10; i++)

free(p);

}

void test()

void test()

void test()

void test()

}int main()

忘記釋放不再使用的動態開闢的空間會造成記憶體洩漏。 切記: 動態開闢的空間一定要釋放,並且正確釋放 。

動態記憶體管理

首先應該明白物件的三種內部的儲存方式 自動儲存,靜態儲存,和動態儲存。當執行離開當期程式塊的時候,堆疊指標返回到它進入程式塊 之前的地方,有效的銷毀了那個程式塊的自動變數。重新進入這個塊會再次建立所有的自動變數。靜態物件宣告或者在檔案域中。動態物件是存在系統呼叫 的在執行期中建立並且儲存在堆中,這是...

動態 記憶體管理

定義變數時,必須制定其資料型別和名字。而動態建立物件時,只需指定其資料型別,而不必為該物件命名。取而代之的是,new表示式返回指向新建立物件的指標,我們通過該指標來訪問此物件。int i int pi new int 這個new表示式在自由儲存區中分配建立了乙個整型物件,並返回此物件的位址,並用該位...

動態記憶體管理

c語言使用malloc calloc realloc free進行動態記憶體管理。void test c 通過new和delete動態管理記憶體。new delete動態管理物件。new delete動態管理物件陣列。void test void test int globalvar 1 stati...