关于动态数组的初步理解
摘要:动态数组的组成以及动态内存分配常用函数的原理以及使用方法。
关键字: 动态数组、 动态内存分配、 指针、 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;
}