可变数组

#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结构体的地址传给函数
}
### 可变数组的概念与实现方式 #### 什么是可变数组可变数组是指其大小可以在运行时动态调整的数据结构。传统的静态数组在声明时就需要指定固定大小,而可变数组则允许开发者根据实际需求增加或减少元素的数量。 #### C语言中的可变数组 在C语言中,可以通过柔性数组(Flexible Array Member, FAM)的方式实现可变数组[^1]。例如,在结构体中定义一个未指定大小的数组成员: ```c struct VariableArray { size_t size; int data[]; }; void createVariableArray(struct VariableArray **arr, size_t n) { *arr = malloc(sizeof(struct VariableArray) + sizeof(int) * n); (*arr)->size = n; } void destroyVariableArray(struct VariableArray *arr) { free(arr); } ``` 上述代码展示了如何通过分配额外内存来创建具有灵活大小的数组[^5]。 #### Scala中的可变数组转换为Java List 在Scala中,`scala.collection.mutable.ArrayBuffer` 是一种常用的可变数组数据结构。可以将其轻松转换为Java的 `java.util.List` 类型。以下是具体实现方法: ```scala import scala.jdk.CollectionConverters._ val arrayBuffer = scala.collection.mutable.ArrayBuffer[Int]() arrayBuffer += (1, 2, 3) // 将 ArrayBuffer 转换为 Java 的 List val javaList: java.util.List[Int] = arrayBuffer.asJava ``` 此代码片段利用了Scala-Java互操作库 `CollectionConverters` 来完成转换过程[^2]。 #### 使用Java实现键盘输入并存储到可变数组 下面是一个基于Java的例子,展示如何让用户从键盘输入任意数量的内容,并将它们存入一个可变数组中: ```java import java.util.ArrayList; public class Main { public static void main(String[] args) { var list = new ArrayList<String>(); try (var scanner = new Scanner(System.in)) { while (scanner.hasNext()) { list.add(scanner.next()); } } System.out.println(list); } } ``` 该程序持续读取用户的输入直到流结束,并把每一个单词加入到列表当中[^4]。 #### GCC扩展下的局部变量长度数组 GCC编译器提供了一种非标准但非常实用的功能——允许函数内部定义依赖于运行时期数值计算得出尺寸的自动数组。不过需要注意的是,这种做法并非跨平台兼容,并且某些情况下可能导致不可预测的行为[^3]。 ### 结论 综上所述,不同编程语言提供了多种途径去处理可变数组的需求。无论是借助高级别的集合框架还是底层手动管理内存的技术手段都可以达成目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值