我有一个程序可以读取游戏中实体的“原始”列表,并且我打算创建一个数组来保存不确定数量的实体的索引号(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 = 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)