c語言程式中,**是放在記憶體中去執行的,我們可以劃分為四大區域。
1.棧區:存放函式的引數值,區域性變數等。當函式執行完畢時他們占有的空間自動釋放。
2.堆區:由程式設計師分配釋放動態(記憶體的申請)。
3.資料區:分為兩種一是常量區,存放常量。一種是是全域性區,存放全域性變數和靜態變數。
4.程式**區:存放函式的二進位制**。
我們一般在棧上面開闢空間來儲存引數和區域性變數:
這裡空間開闢的大小是固定的,陣列必須指定長度,所需要的內存在編譯時分配。但是有時候在程式執行時我們才知道空間的大小,這時我們就需要動態記憶體分配。
1.malloc
2.free
3.calloc
4.realloc
一.malloc和free
malloc
void
*malloc
( size_t size )
;
申請一段連續的空間,並返回void*
如果開闢成功,則返回乙個指向開闢好空間的指標。
如果開闢失敗,則返回乙個null指標,因此malloc的返回值一定要做檢查。
malloc函式並不知道開闢空間的型別,具體在使用的時候使用者自己來決定。
如果引數 size 為0,malloc的行為是標準是未定義的,取決於編譯器。
free
void
free
(void
*memblock )
;
動態記憶體的釋放和**
引數 memblock指向的空間不是動態開闢的,那free函式的行為是未定義的。
引數 memblock 是null指標,則函式無操作。
eg:
int
main()
malloc在堆上開闢了一段空間,free釋放了這段空間。
calloc
void
*calloc
( size_t num, size_t size )
;
開闢一段連續的空間並且將它初始化為0。
memblock是調整的記憶體的位址,size是調整後的大小。
(這個函式調整原記憶體空間大小的基礎上,還會將原來記憶體中的資料移動到 新 的空間。)
realloc函式的出現讓動態記憶體管理更加靈活。
有時會我們發現過去申請的空間太小了,有時候我們又會覺得申請的空間過大了,那為了合理的時候記憶體,我們一定會對記憶體的大小做靈活的調整。那 realloc 函式就可以做到對動態開闢記憶體大小的調整。
第二中情況的時候,原有空間之後沒有足夠多的空間時,擴充套件的方法是:在堆空間上另找乙個合適大小的連續空間來使用。這樣函式返回的是乙個新的記憶體位址。
eg:
!
[int
main()
else
//擴充套件容量
//**1
ptr =
realloc
(ptr,
1000);
//**2
int*p =
null
; p =
realloc
(ptr,
1000);
if(p !=
null
)//業務處理
兩個記憶體的位置空間不是同一塊地方了,說明記憶體空間不夠擴容開闢了新的空間。
傳遞動態記憶體
當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道.這些往往會使人受盡折磨.所以如果你想深入c c 程式設計,你必須靜下心來,好好苦一番.現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞.並且在軟體開發中很多專業...
傳遞動態記憶體
當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道。這些往往會使人受盡折磨,所以如果你想深入c c 程式設計,你必須靜下心來好好苦一番。現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞。並且在軟體開發中很多專業人...
動態記憶體分配
在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...