欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

可变数组

程序员文章站 2022-06-14 19:05:20
...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BLOCK_SIZE 20//每次数组满时,补增多少空间
typedef struct {
  int *array;
  int size;
} Array;

Array array_create(int init_size);//创建一个数组
void array_free(Array *a);//释放数组空间
int array_size(const Array *a);//数组的长度
int *array_at(Array *a, int index);//访问单元
void array_inflate(Array *a, int more_size);//数组增长

Array array_create(int init_size){
  Array a;//定义一个结构体变量
  a.size = init_size;
  a.array = (int *)malloc(sizeof (int) * init_size);//让结构体中的指针指向分配好的内存空间
  return a;//返回一个结构体
}
void array_free(Array *a){//形参为结构体指针,指向结构体
  free(a->array);//释放申请的空间
  a->array = NULL;
  a->size = 0;   //令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);//index可以理解为当前数组的长度/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;//将数组的size增加
} */

void array_inflate(Array *a , int moresize){
  int *p = (int *)malloc(sizeof(int) * (a->size + moresize));
  memcpy(p, a->array, sizeof(int));//memcpy函数使用:函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中。
  free(a->array);
  a->array = p;
  a->size += moresize;
}

int main()
{
  Array a = array_create(1);//向内存申请空间
  printf("initalized array->size = %d\n", array_size(&a));
  int number = 0;
  int cnt = 0;
  while(number != -1){
    scanf("%d", &number);
    if(number != -1){
      *array_at(&a, cnt) = number;
      printf("a->size = %d a->array[%d]= %d\n",array_size(&a),cnt,*array_at(&a, cnt));
      cnt++;
    }
  }
  array_free(&a);//将a结构体的地址传给函数
}