我有一个程序,可以读取游戏中实体的"原始"列表,我打算制作一个数组,其中包含不确定数量的实体的索引号(int),用于处理各种事情.我想避免使用太多的内存或CPU来保存这样的索引...

到目前为止,我使用的一个快速而肮脏的解决方案是,在主处理函数(本地焦点)中声明具有最大游戏实体大小的数组,以及另一个整数,以跟踪有多少已添加到列表中.

我没有找到任何C(不C++或C)特定的解决方案来实现这一点.我可以使用指针,但我有点害怕使用它们(除非这是唯一可能的方法).

数组不会离开本地函数作用域(它们将被传递给函数,然后被丢弃),以防发生变化.

如果指针是唯一的解决方案,我如何跟踪它们以避免泄漏?

推荐答案

我可以使用指针,但我有点害怕使用它们.

如果需要动态数组,则不能转义指针.不过,你为什么会害怕呢?它们不会咬人(也就是说,只要你小心).C中没有内置的动态数组,您只能自己编写一个.在C++中,您可以使用内置的std::vector类.C#和几乎所有其他高级语言都有一些类似的类,可以为您管理动态array.

如果您确实计划编写自己的数组,可以从以下内容开始:大多数动态数组实现的工作方式都是从某个(小)默认大小的数组开始,然后每当您在添加新元素时耗尽空间时,将数组的大小增加一倍.正如您在下面的示例中看到的,这一点也不困难:(为简洁起见,我省略了安全判断)

typedef struct {
  int *array;
  size_t used;
  size_t size;
} Array;

void initArray(Array *a, size_t initialSize) {
  a->array = malloc(initialSize * sizeof(int));
  a->used = 0;
  a->size = initialSize;
}

void insertArray(Array *a, int element) {
  // a->used is the number of used entries, because a->array[a->used++] updates a->used only *after* the array has been accessed.
  // Therefore a->used can go up to a->size 
  if (a->used == a->size) {
    a->size *= 2;
    a->array = realloc(a->array, a->size * sizeof(int));
  }
  a->array[a->used++] = element;
}

void freeArray(Array *a) {
  free(a->array);
  a->array = NULL;
  a->used = a->size = 0;
}

使用它同样简单:

Array a;
int i;

initArray(&a, 5);  // initially 5 elements
for (i = 0; i < 100; i++)
  insertArray(&a, i);  // automatically resizes as necessary
printf("%d\n", a.array[9]);  // print 10th element
printf("%d\n", a.used);  // print number of elements
freeArray(&a);

C++相关问答推荐

了解返回函数指针的函数定义

如何从TPS特定的TGPT_PUBLIC数据 struct 中以OpenSSL的EVP_PKEY

Bison解析器转移/减少冲突

ISO_C_BINDING,从Fortran调用C

有效地计算由一组点构成的等边三角形和等腰三角形的数量

由Go调用E.C.引起的内存快速增长

在struct中调用函数,但struct在void中 *

有没有更简单的方法从用户那里获取数据类型来计算结果

在C语言中,是否可以使枚举数向后计数?

Square不与Raylib一起移动

getline()从c中的外部函数传递指针时输出null

如何用c语言修改shadow文件hash部分(编程)?

通过k&;r语法的c声明无效

Valgrind正在使用一个Fexecve电话报告不可能发生的事情

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

c程序,让用户输入两类数字,并给出输出用户输入多少个数字

从整型转换为浮点型可能会改变其值.

是什么阻止编译器优化手写的 memcmp()?

free后内存泄漏?

在带中断的循环缓冲区中使用 易失性