關於動態數組的初步理解
摘要:動態數組的組成以及動態內存分配常用函數的原理以及使用方法。
關鍵字: 動態數組、 動態內存分配、 指針、 malloc()、 free()、 sizeof()
動態數組是把指針與動態內存分配內存聯用。
- 動態內存分配是指在程序運行時爲變量分配內存的一種方法。 C的動態內存分配從堆上分配內存。使用這些函數時只需要在程序開頭將頭文件
<cstdli.b>
包含到源程序。 函數malloc():
函數malloc()用於分配若干字節的內存空間,返回一個指向該內存首地址的指針。若系統不能提供足夠的內存單元,函數將返回空指針NULL。
函數原型爲:void *malloc(unsingend int size);
size表示向系統申請空間的大小。 指針的返回類型爲
void *
是無類型的指針, 因此需要通過強制轉換將指針轉換爲所需要的類型。例如:int *p = NULL; p = (int *)malloc(2);
通常情況下,爲了增加代碼可移植性或者不確定某種類型所佔的字節數則用
sizeof()
來計算該類型所佔字節數:p = (int *)malloc(siezoef(int));
函數realloc(): 如果數組長度不夠了怎麼辦呢,我們可以使用
realloc()
函數改變原來分配的空間大小,其原型爲:void * realloc(void *p, unsigned int size);
需要注意的是,函數返回的新的地址不一定與原地址相同。所以一旦改變了指針的指向,原來分配的內存和數據也會丟失。
函數free(): 函數free的功能是釋放向系統動態申請的由指針p指向的內存空間,由系統重新支配,該函數無返回值。其原型爲:
void free(void *p);
如果我們在程序中忘記釋放內存,就會造成內存泄漏。因此要儘量配套使用
malloc()
和free()
或者重複利用malloc()
申請到的內存。
- 動態內存分配是指在程序運行時爲變量分配內存的一種方法。 C的動態內存分配從堆上分配內存。使用這些函數時只需要在程序開頭將頭文件
程序樣例:
功能:
- 在i位置插入數字num
- 刪除第i個位置的數字並輸出這個數
- 打印當前的數組
- 退出程序
#include <cstdio>
#include <cmath>
#include <cstdlib>
const int addlen = 10;
const int initlen = 100;
struct sq{
int *pos;
int len, maxlen;
};
bool init(sq &L){
L.pos = (int *)malloc(initlen * sizeof(int));
if(!L.pos) return false;
L.len = 0, L.maxlen = initlen;
return true;
}
bool add(sq &L, int i, int num){
if(i < 1 || i > L.maxlen) return false;
if(L.len >= L.maxlen){
int * newpos = (int *)realloc(L.pos, (L.maxlen + addlen) * sizeof(int));
if(!newpos) return false;
L.pos = newpos;
L.maxlen += addlen;
}
int *q = L.pos + i - 1;
for(int *p = L.pos + L.len - 1; p >= q; p--) *(p + 1) = *p;
*q = num;
L.len++;
return true;
}
bool del(sq &L, int i, int &num){
if(i < 1 || i > L.len) return false;
int *p = L.pos + i - 1;
num = *p;
for(int *p = L.pos + i; p < L.pos + L.len; p++) *(p - 1) = *p;
L.len--;
return true;
}
void print(sq &L){
for(int i = 0; i < L.len; i++) printf("%d ", L.pos[i]);
printf("\n");
}
int main()
{
int x = 0;
sq L;
init(L);
while(true){
scanf("%d", &x);
if(x == 1) {
int p, num;
scanf("%d %d", &p, &num);
if(!add(L, p, num)) printf("can't do this\n");
}
else if(x == 2){
int p, num;
scanf("%d", &p);
if(!del(L, p, num)) printf("can't do this\n");
else printf("%d\n", num);
}
else if(x == 3) print(L);
else if(x == 0) break;
}
free(L.pos);
return 0;
}