C語言 動態記憶體管理

2021-10-09 12:27:16 字數 2129 閱讀 3658

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

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

但是上述的開闢空間的方式有兩個特點:

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

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

但是,有時候我們所需要的空間大小在程式執行時才知道,那陣列的編譯時開闢空間的方式就不行了,這時我就得試試動態開闢了。

2.1 malloc和free

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

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

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

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

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

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

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

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

#include

intmain()

}free

(ptr)

; ptr =

null

;return0;

}

2.2 calloc

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

☆與函式 malloc 的區別只在於 calloc 會在返回位址之前把申請的空間的每個節初始化為全0。

#include

#include

intmain()

free

(p);

p =null

;return0;

}

2.3 realloc

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

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

void* realloc ( void*ptr , size_t size );
☆ptr是要調整的的記憶體位址。

☆size是調整後的大小。

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

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

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

1.原有空間之後有足夠的空間。

2.原有空間之後沒有足夠大的空間。

情況1

當是情況1 的時候,要擴充套件記憶體就直接原有記憶體之後直接追加空間,原來空間的 資料不發生變化。

情況2

當是情況2 的時候,原有空間之後沒有足夠多的空間時,擴充套件的方法是:在堆空間上另找乙個合適大小的連續空間來使用。這樣函式返回的是乙個新的記憶體位址。

由於上述的兩種情況,realloc函式的使用就要注意一些。 舉個例子:

#include

< stdio.h >

intmain()

else

int* ptr = realloc ( p,

1000);

if( ptr !=

null

)//處理

free

( p )

; p =

null

;}

C語言動態記憶體管理

1 概述 動態儲存管理的基本問題是 系統如何按請求分配記憶體,如何 記憶體再利用。提出請求的使用者可能是系統的乙個作業,也可能是程式中的乙個變數。空閒塊 未曾分配的位址連續的記憶體區稱為 空閒塊 占用塊 已分配給使用者使用的位址連續的記憶體區稱為 占用塊 系統剛剛啟動時,整個記憶體可看做乙個大的 空...

C語言動態記憶體管理

c系統的函式庫中提供了了程式動態申請和釋放記憶體儲存塊的庫函式,下面將分別介紹。1 malloc 函式 a 該函式的原型 void malloc size t size b 該函式只有乙個引數,且形參size是無符號整型,該引數代表申請空間的位元組數。c 返回值 如果記憶體池中的可用記憶體滿足需求,...

C語言動態記憶體管理

在說明c語言記憶體管理之前,要知道什麼是記憶體,記憶體我個人認為可以理解為帶有標籤的盒子,所謂的帶標籤的盒子就像我們住的寢室一樣有門牌號,盒子內只能儲存固定型別的資料或變數,就如男生寢室只能住男生一樣。那麼c語言中有多少種盒子呢?有靜態儲存區 動態儲存區 內部暫存器區域。我們通常定義的變數如果沒有特...