C語言高階複習(四) 動態記憶體管理(c重點)

2021-10-03 23:07:29 字數 3050 閱讀 8179

int val =20;

//在棧空間上開闢四個位元組

char arr[10]

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

但是這樣開闢的空間要求我們事先知道要用的空間大小

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

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

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

c語言提供的乙個動態記憶體開闢的函式。

void

* malloc (size_t size)

;

這個函式向記憶體申請一塊連續可用的空間,並返回指向這塊空間的指標。

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

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

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

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

c語言提供了另外乙個函式free,專門是用來做動態記憶體的釋放和**的(與malloc等開闢記憶體的函式成雙成對),函式原型如下:

void free (

void

* ptr)

;

free函式用來釋放動態開闢的記憶體。

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

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

int main()

}free

(ptr)

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

ptr =

null

;//不置空的話,只是釋放了記憶體,指向並沒有改變,但是原來指向的記憶體情況不能確定了(可能被作業系統分配給其他的指標)

return0;

}

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

void

* calloc (size_t num, size_t size)

;

功能是為 num 個大小為 size 的元素開闢一塊空間,並且把空間的每個位元組初始化為0。

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

所以如何我們對申請的記憶體空間的內容要求初始化,那麼可以很方便的使用calloc函式來完成任務。

int

main()

free

(p);

p =null

;return

0}

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

void

* realloc (

void

* ptr, size_t size)

;

由於事情的突然變化,有時會我們發現過去申請的空間太小了,可能不夠用,有時候我們又會覺得申請的空間過大了浪費了很多,那為了合理的時候記憶體,我們一定會對記憶體的大小做靈活的調整。那 realloc 函式就可以做到對動態開闢記憶體大小的調整。

1.ptr 是要調整的記憶體位址

2.size 調整之後新大小

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

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

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

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

情況2:原有空間之後沒有足夠大的空間來擴充套件

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

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

對null指標的解引用操作

void

test()

對動態開闢空間的越界訪問

void

test()

}free

(p);

}

對非動態開闢記憶體使用free釋放

void

test()

使用free釋放一塊動態開闢記憶體的一部分

void

test()

對同一塊動態記憶體多次釋放

void

test()

動態開闢記憶體忘記釋放(記憶體洩漏)

void

test()

}int

main()

忘記釋放不再使用的動態開闢的空間會造成記憶體洩漏。

切記: 動態開闢的空間一定要釋放,並且正確釋放 。

棧區(stack):在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

棧區主要存放執行函式而分配的區域性變數、函式引數、返回資料、返回位址等。

堆區(heap):一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。分配方式類似於

鍊錶。資料段(靜態區)(static)存放全域性變數、靜態資料。程式結束後由系統釋放。

**段:存放函式體(類成員函式和全域性函式)的二進位制**。

分享文章–>c語言結構體裡的成員陣列和指標

c 複習 動態記憶體管理。

在c語言中,我們通常都會使用malloc calloc realloc和free來進行動態記憶體管理。malloc calloc realloc用來在堆上開闢空間。free用來釋放申請的空間。int ptr1 int malloc sizeof int 10 malloc函式會申請對應大小的空間,返...

C語言動態記憶體管理

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

C語言動態記憶體管理

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