複製鏈接
請複製以下鏈接發送給好友

動態內存分配

鎖定
在c/c++語言中,編寫程序有時不能確定數組應該定義為多大,因此這時在程序運行時要根據需要從系統中動態多地獲得內存空間。所謂動態內存分配,就是指在程序執行的過程中動態地分配或者回收存儲空間的分配內存的方法。動態內存分配不像數組靜態內存分配方法那樣需要預先分配存儲空間,而是由系統根據程序的需要即時分配,且分配的大小就是程序要求的大小。
中文名
動態內存分配
所屬學科
信息科學
定    義
動態地分配或回收存儲空間的方法
C語言
malloccallocfree 函數
C++語言
運算符new、運算符delete
特    點
由系統根據程序的需要即時分配

動態內存分配C語言函數

C語言允許建立內存動態分配區域,以存放一些臨時用的數據,這些數據不必在程序的聲明部分定義,也不必等到函數結束時才釋放,而是需要時隨時開闢,不需要時隨時釋放。C語言中,內存的動態分配是通過系統提供的庫函數來實現的,主要有malloc、calloc和 free 函數。

動態內存分配malloc 函數

其函數原型為
void *malloc(unsigned int size);
其作用是在內存的動態存儲區中分配一個長度為size的連續空間。此函數的返回值是分配區域的起始地址,或者説,此函數是一個指針型函數,返回的指針指向該分配域的開頭位置。如:
malloc(100);/*開闢 100 個字節的臨時分配域,返回值為其第一個字節的地址*/
注意指針的基類型為 void,即不指向任何類型的數據,只提供一個地址。如果此函數未能成功的執行(例如內存空間不足),則返回空指針(NULL)。

動態內存分配calloc函數

函數原型為
void *calloc(unsigned n, unsigned size)
其作用是在內存的動態存儲區中分配n個長度為 size 的連續空間。函數返回一個指向分配區域的起始位置的指針;如果分配不成功,則返回NULL。
採用 calloc 函數可以為一維數組開闢動態存儲空間,n 為數組元素個數,每個元素長度為 size,這就是動態數組。如:
p = calloc(50,4) /*開闢 50*4個字節的臨時分配域,把起始地址賦給指針變量p */

動態內存分配free 函數

函數原型為
void free(void*p);
其作用是釋放指針 p 所指向的動態空間,使這部分空間能被其他變量使用。p 是最近一次調用 calloc 或malloc 函數時的返回值。free函數無返回值。如:
free(p); /*釋放指針變量p指向的已分配的動態空間*/
上述三個函數在頭文件malloc.h和 stdlib.h 中定義。若要使用,必須在程序的開始將頭文件用文件包含命令放到本文件中來。 [1] 

動態內存分配函數運算符

動態內存分配new

運算符new用於向系統申請動態存儲空間,並把首地址作為運算結果,它的使用形式為:
指針變量=new 數據類型;
例如:
int *p=new int
該語句的作用是會用new從內存中申請了一個int型變量(4個字節),並將該變量的首地址賦給指針變量p。
new所建立的變量的初始值是任意的,也可在用new分配內存的同時進行初始化。使用形式為:
指針變量=new 數據類型(初始值)。

動態內存分配delete

堆內存可按照要求進行分配,程序對內存的需求量隨時會發生變化,有時程序在運行種可能會不再需要由new分配的內存空間,而且程序還未運行結束,這時就需要把先前佔用的內存空間釋放給堆內存,以後重新分配,供程序的其他部分使用。運算符delete用於釋放new分配的內存空間,刪除建立的對象,它的使用形式為:
delete 指針變量
其中的指針變量中保存着new分配的內存的首地址。 [2] 
參考資料
  • 1.    吳延海、黃健.C++語言簡明教程:西安電子科技大學出版社,2012
  • 2.    柴欣.C/C++程序設計:中國科學技術出版社,2006