我有一个程序可以读取游戏中实体的“原始”列表,并且我打算制作一个数组,其中包含不确定数目的实体的索引号(int),用于处理各种事物。我想避免使用过多的内存或CPU来保持此类索引...

到目前为止,我使用的一种快速而肮脏的解决方案是在主处理函数(局部焦点)中声明具有最大游戏实体大小的数组,以及另一个用于跟踪已添加到列表中的整数的整数。
这是不令人满意的,因为每个列表都包含3000多个数组,虽然数量不多,但感觉很浪费,因为我可能会针对不同功能使用6-7个列表的解决方案。

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

数组不会离开局部函数范围(它们将被传递给函数,然后被丢弃),以防万一发生改变。

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

最佳答案

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


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

如果您确实打算编写自己的代码,那么可以开始以下工作:大多数动态数组实现通过以一些(较小)默认大小的数组开始工作,然后每当添加新元素时空间不足时,将其加倍。数组的大小。如您在下面的示例中看到的,这一点都不困难:(为了简洁起见,我省略了安全检查)

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

void initArray(Array *a, size_t initialSize) {
  a->array = (int *)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 = (int *)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 - C动态增长数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40819903/

10-11 22:44
查看更多