在很多情況下,我們不知道所要建立陣列的大小,而是想根據需求動態的建立陣列。但是通常使用 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 和 ...