動態建立陣列

2021-08-17 21:01:55 字數 2455 閱讀 7296

在很多情況下,我們不知道所要建立陣列的大小,而是想根據需求動態的建立陣列。但是通常使用 int arr[n] 這樣的寫法編譯器會報錯,因為n是變數。例如以下**

int n = 10;

int a[n];

對於這種情況我們可以用以下的方法解決。

用到的標頭檔案:# include

用到的函式:malloc()  sizeof()

用法如下:

int n = 10;

int *p = (int*) malloc (n * sizeof(int));//建立可以存放是個int型資料的陣列

解釋:

1、malloc()函式的形參是要分配的位元組數,注意是位元組數,不是單元數。

2、malloc函式返回的是乙個無型別的首位址,因此必須在malloc函式前加上型別強轉,轉換為自己需要的資料型別

3、因為malloc函式只負責分配記憶體,所以我們需要自己定義相應的型別變數來接收malloc分配的記憶體,注意malloc函式返回的      是分配記憶體的首位址,所以接收的變數也應該是相應的指標型別

注意:動態陣列記憶體是在堆區分配,堆區有2g記憶體

當分配完成之後,使用完全和陣列用法相同,如下:

void dynamicarray()

{ int n = 10;

int *p = (int*) malloc (n * sizeof(int));//建立可以存放是個int型資料的陣列

//陣列賦值

for(int i=0;i二、記憶體的釋放

用到的函式:free()

用法:free(p);

如果不對在堆區分配的記憶體進行釋放,會導致記憶體洩漏,記憶體洩露一般不容易查不容易修改,因此在程式設計過程中一定注意要釋放記憶體。

三、動態建立並初始化陣列

用到的函式:calloc()

calloc函式有兩個形參,第乙個是元素的數目,第二個是每個元素的位元組數

calloc函式將陣列每個元素初始化為0

用法:

int n = 10;

int *p = (int*) calloc(n,sizeof(int));

for(int i=0;i四、陣列擴容

有時候動態陣列分配過程中會發生陣列大小不夠的問題,我們就需要對陣列進行擴容

用到的函式:realloc()

realloc函式第乙個形參是:對以前指定的指標記憶體塊

realloc函式第二個形參是:新的大小 (以位元組為單位)。

realloc函式返回的也是無型別的位址,因此自己定義相應的型別變數來接收realloc分配的記憶體

用法:int n = 10;

int *p = (int*) malloc (n * sizeof(int));//建立可以存放是個int型資料的陣列

//陣列賦值

for(int i=0;i五、free函式容易引起崩潰的解決

在堆區分配的記憶體塊中都有乙個頭標記和尾標記,頭標記在記憶體塊首位址向前偏移一點的位置處,尾位址在記憶體塊末尾篇後一點處,所有free崩潰的原因都是因為free函式找不到記憶體塊的頭或尾。共有以下幾種情況

1、越界(如下**)

int n = 10;

int *p = (int*) malloc (n * sizeof(int));//建立可以存放是個int型資料的陣列

//陣列賦值

for(int i=0;i此段**陣列值定義了10個單元格,而在賦值過程中卻迴圈了20次,在賦值過程中破壞了記憶體塊尾部標記,導致free函式找不到尾標記,程式崩潰。

2、指標移動(如下**)

int n = 10;

int *p = (int*) malloc (n * sizeof(int));//建立可以存放是個int型資料的陣列

//陣列賦值

for(int i=0;i此段**,陣列在賦值過程中採用指標移動賦值,導致賦值結束指標變數p沒有指向記憶體塊頭部,free函式找不到記憶體塊頭標記,程式崩潰。

3、重複釋放(**如下)

int n = 10;

int *p = (int*) malloc (n * sizeof(int));//建立可以存放是個int型資料的陣列

//陣列賦值

for(int i=0;i此段**,p和q指向同乙個記憶體塊,因此就等於對乙個記憶體塊free了兩次,在第一次free過程中沒有問題,而在第二次free是就找不到頭標記和尾標記,程式崩潰

4、釋放棧記憶體(**如下)

int a[10];

free(a);

此段**,在棧中定義了乙個陣列,棧中的記憶體塊不存在頭標記和尾不標記,因此free函式找不到頭標記和尾標記,程式崩潰。

建立動態陣列

1.動態陣列的定義 int pia new int 10 2.初始化動態的陣列 string psa new string 10 int pia new int 10 3.const物件的動態陣列 4.允許動態分配空陣列 size t n get size int p new int n 如果上述的...

C 建立動態陣列

int sum 0 arraylist al new arraylist private void button1 click object sender,eventargs e while str null str string line new string al.count 1 al.copy...

建立動態陣列(c primer)

動態分配的陣列不必在編譯時知道其長度,可以 通常也是 在執行時才確定陣列長度。與陣列變數不同,動態分配的陣列將一直存在,直到程式顯式釋放它為止。每乙個程式在執行時都占用一塊可用的記憶體空間,用於存放動態分配的物件,此記憶體空間稱為程式的自由儲存區或堆。c 語言程式使用一對標準庫函式malloc 和 ...