实现动态数组需要使用到堆区,主要的方法就是:
定义申请一个堆区空间,判断空间是否储存满了,如果满了就将重新申请一个空间,空间的长度相比以前更大,将原来的空间内容赋值给新的堆区,释放原来的堆区空间,将指针重新指向新的空间首地址。
下面是一个简单的案例,主要的功能是输入数据并将之储存到动态数组里面,由于代码过长,这里只有两个功能,1是输入数字,2是遍历输入的数字,0是退出,主要的动态数组实现在case1,其他过长的部分请省略。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Array
{
int* pa; //堆区的地址
unsigned short len; //自定义数组长度
short index; //数组元素个数
};
void main()
{
//1.申请空间
struct Array a={NULL,0,-1}; //初始化
//2.引用
while(1)
{
int num,opt,i;
printf("输入选项(0~2)");
scanf("%d",&opt);
switch(opt)
{
case 1:
{
printf("输入数字");
scanf("%d",&num);
if(a.index+1==a.len) //数组空间满
{
//重新申请空间,增加10个空间长度
int* pb=(int*)malloc((a.len+10)*sizeof(int));
if(NULL!=pb)
{
//将原来的数组元素赋值给新的数组
memcpy(pb,a.pa,sizeof(int)*a.len);
a.len+=10;
//释放原来的空间;
free(a.pa);
//重新将指针指向新的数组
a.pa=pb;
}
}
//将输入的值存进数组
a.pa[++a.index]=num;
}break;
case 2:
{
for(i=0;i<=a.index;i++)
printf("%d ",a.pa[i]);
printf("\n");
}break;
case 0:
return ;
default:
printf("输入错误\n");
}
}
}