C和C 動態分配記憶體

2021-07-27 08:42:08 字數 2841 閱讀 4706

1 基本語法

動態分配記憶體有兩種方式:

① malloc申請記憶體+free釋放記憶體:

標頭檔案:#include

用法示例:char* p=(char*) malloc(84);

含義:申請能存放84個char型別資料的空間,也就是說,開闢一塊84位元組的記憶體空間,p為指向這塊空間的指標

通用的方法為:

object* p=(object*)malloc(sizeof(object));
其中,object可以是c或c++本來就定義好的型別,也可以是自己定義的型別。

free可以釋放malloc開闢的記憶體,不是malloc開闢的記憶體無法通過free釋放。

free(p);
② new申請記憶體+delete釋放記憶體

標頭檔案:不需要

用法示例:

string* sp=new

string("a value"); //分配並初始化乙個string物件

string* arr=new

string[10]; //分配10個預設初始化的string物件

通用的方法為:

object* p2=new

object;

開闢乙個存放object的儲存空間。

object* p2=new

object(data);

開闢乙個存放object的空間,並指定初值為data。

其中,object可以是c或c++本來就定義好的型別,也可以是自己定義的型別。

用delete釋放空間:

delete p2;
2 處理陣列

① 用malloc和free建立和釋放多維陣列的空間

參考資料:

給二維陣列(m*n)分配空間:

char **a, i;  // 先分配m個指標單元,注意是指標單元,所以每個單元的大小是sizeof(char *)

a = (char **)malloc(m * sizeof(char *)); // 再分配n個字元單元,上面的m個指標單元指向這n個字元單元首位址

for(i = 0; i < m; i++) a[i] = (char *)malloc(n * sizeof(char));

釋放:

int i;

for(i=0;ifree((void *)a[i]);

free((void *)a);

為三維陣列(m*n*p)分配空間:

char ***a, i, j;

a = (char ***)malloc(m * sizeof(char **));

for(i = 0; i < m; ++i) a[i] = (char **)malloc(n * sizeof(char *));

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

for(j = 0; j < n; ++j)

a[i][j] = (char *)malloc(p * sizeof(char));

釋放:

int i,j,;

for(i = 0; i

< m; ++i)

for(j = 0; j

< n; ++j)

free((void *)a[i]

[j]);

for(i = 0; i

< m; ++i)

free((void *)a[i]);

free((void *)a);

② 用new和delete建立和釋放多維陣列的空間

參考資料:

一維陣列動態記憶體的建立:

int *array1d;

array1d = new

int [m];

釋放:

delete  array1d;
二維陣列動態記憶體的建立:

int **array2d;

//假定陣列第一維長度為m, 第二維長度為n

//動態分配空間

array2d = new

int *[m];

for( int i=0; inew

int [n] ;

釋放:

for( int i=0; i

i++ )

delete array2d;

事實上二維陣列空間的釋放還可以更簡單地用:delete array2d;

三維陣列動態記憶體的建立:

int ***array3d;

//假定陣列第一維為m, 第二維為n, 第三維為h

//動態分配空間

array3d = new

int **[m];

for( int i=0; inew

int *[n];

for( int j=0; jnew

int [h];

}}

釋放

for( int i=0; ifor( int j=0; jdelete array3d[i][j];

}delete array3d[i];

}delete array3d;

C語言動態分配記憶體

動態開闢記憶體的函式 void malloc size t size 這個函式向記憶體申請 塊連續可 的空間,並返回指向這塊空間的指標 如果開闢成功,則返回 個指向開闢好空間的指標 如果開闢失敗,則返回 個null指標,因此malloc的返回值 定要做檢查 返回值的型別是 void 所以malloc...

C 動態分配 C 的記憶體模型

c 程式語言有3種不同型別的變數 全域性變數,區域性 動態分配變數。變數的值儲存在計算機的主存中,但是變數儲存的方式取決於變數的型別。3種型別的變數分別對應儲存器中的3個特定的區域 1.全域性變數儲放在儲存器中的固定位置 2.區域性變數存放在執行時棧上 3.動態分配變數存放在堆上 全域性變數的宣告在...

C語言動態分配記憶體知識

陣列的長度必須事先指定,只能是常整數,不能是變數 傳統形式定義的陣列,該陣列的記憶體程式設計師無法手動釋放,只能在定義 該陣列的函式使用完畢後,釋放陣列占用的記憶體。陣列的長度一旦定義,其長度就不能更改。傳統形式定義的陣列不能跨函式使用。動態記憶體分配可以很好的解決傳統陣列的缺點。傳統陣列也被稱之為...