可变大小数组
在定义数组的时候通常要先确定数组的大小,但是在实际运用当中,我们往往不知道我们要用到的这个数组到底要多大,所以需要用到可变大的数组。
//声明数组结构体
typedef struct
{
int *array;
int size;
}Array;
//创建一个长度为init_size的数组
Array array_create(int init_size)
{
Array a ;
a.size = init_size;
//动态申明一个数组
a.array = (int*)malloc(sizeof(int) * a.size);
return a;
}
//释放数组函数
void array_free(Array *a)
{
free(a->array);
a-> array = NULL;
a->size = 0;
}
//数组大小函数
int array_size(const Array *a)
{
return a->size;
}
//访问数组中元素,当数组越界时自动增长数组长度
int* array_at(Array *a, int index)
{
if(index >= a->size)
{
array_inflate(a, (index/BLOCK_SIZE +1) * BLOCK_SIZE - a->size); //计算出一次性涨BLOCK_SIZE个内存大小
}
return &(a->array[index]);
}
//数组增长函数
void array_inflate(Array *a, int more_size)
{
int *p = (int*)malloc(sizeof(int)*(a->size + more_size));
int i;
for(i = 0; i < a->size; i++)
{
p[i] = a->array[i];
}
free(a->array);
a->array = p;
a->size += more_size;
}
int main(int argc, char const *argv[ ])
{
int cnt = 0;
int number = 0;
Array a = array_create(BLOCK_SIZE);
//当输入-1时退出操作
while(number != -1)
{
scanf("%d", &number);
if(number != -1)
*array_at(&a, cnt++) = number;
}
printf("size: %d
", array_size(&a));
array_free(&a);
return 0;
}
以上代码中的BLOCK_SIZE是一个宏定义
#define BLOCK_SIZE 5 //每次增长5个int长度
运用可变数组的缺陷:
1、有内存空间但是却无法再申请内存了,这是由于申请来的内存必须是连在一起的一大块,无法有效地利用那些零散的内存空间,这种情况在单片机上尤为突出,因此,如果可以的话就尽量使用链表来实现新的内存的申请。
2、当增加数组长度的时候,需要对原来数组中的元素进行拷贝,这样做效率底下。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。