2

是否可以在 C 中“动态”分配文件指针?我的意思是:

FILE **fptr;
fptr = (FILE **)calloc(n, sizeof(FILE*));

其中 n 是一个整数值。我需要一个指针值数组,但在获得用户输入之前我不知道有多少,所以我无法对其进行硬编码。任何帮助都会很棒!

4

2 回答 2

2

您正在尝试实现有时称为灵活数组(或flex 数组)的东西,即在程序生命周期内动态改变大小的数组。)在 C 的本机类型系统中不存在这样的实体,所以你必须自己实现它。在下文中,我将假设它T是数组中元素的类型,因为这个想法与任何特定类型的内容没有任何关系。(在你的情况下,TFILE *。)

或多或少,您需要一个如下所示的结构:

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 通常来说是一个好主意。相反,如果您将其大小增加一个恒定增量,则您将花费​​二次时间来复制数组的元素。

我没有展示缩小数组的代码,但它与增长代码非常相似,

于 2012-10-26T07:34:59.110 回答
1

无论如何,它只是指针,因此您可以为它们分配内存,但不要忘记fclose()每个文件指针,然后free()是内存

于 2012-10-26T07:04:29.610 回答