您正在尝试实现有时称为弹性数组(或弹性数组)的东西,即在程序生命周期内动态改变大小的数组.) 这样的实体在 C 的本机类型系统中不存在,因此您必须自己实现它。在下文中,我将假设 T 是数组中元素的类型,因为这个想法与任何特定类型的内容没有任何关系。 (在你的情况下,T 是 FILE *。)
或多或少,你想要一个看起来像这样的结构:
struct flexarray {
T *array;
int size;
}
和一系列函数来初始化和操作这个结构。首先,让我们看一下基本的访问器:
T fa_get(struct flexarray *fa, int i) { return fa->array[i]; }
void fa_set(struct flexarray *fa, int i, T p) { fa->array[i] = p; }
int fa_size(struct flexarray *fa) { return fa->size; }
请注意,为了简洁起见,这些函数不会进行任何错误检查。在现实生活中,您应该为fa_get 和fa_set 添加边界检查。这些函数假定 flexarray 已经初始化,但不显示如何执行此操作:
void fa_init(struct flexarray *fa) {
fa->array = NULL;
fa->size = 0;
}
请注意,这开始时 flexarray 为空。使这样的初始化程序创建一个固定最小大小的数组是很常见的,但从大小为零开始可以确保您执行您的数组增长代码(如下所示)并且在大多数实际情况下几乎没有成本。
最后,如何使flexarray 更大?其实很简单:
void fa_grow(struct flexarray *fa) {
int newsize = (fa->size + 1) * 2;
T *newarray = malloc(newsize * sizeof(T));
if (!newarray) {
// handle error
return;
}
memcpy(newaray, fa->array, fa->size * sizeof(T));
free(fa->array);
fa->array = newarray;
fa->size = newsize;
}
请注意,flexarray 中的新元素是未初始化的,因此您应该安排在每个新索引 i 中存储一些内容,然后再从中获取。
每次通过一些常数乘数来增长 flexarrays 通常来说是一个好主意。相反,如果您将其大小增加一个恒定的增量,您将花费二次时间来复制数组的元素。
我没有展示缩小数组的代码,但它与增长代码非常相似,