【问题标题】:Dynamically allocate array of file pointers动态分配文件指针数组
【发布时间】:2012-10-26 06:59:50
【问题描述】:

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

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

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

【问题讨论】:

  • 这种数组的原因是什么?
  • 如果你想要一个 FILE* 数组,你上面的代码就可以了。每个 FILE* 都可以使用 fptr[n] 进行索引。完成后确保关闭所有这些并释放()块。我不会问你为什么要这么做。那是你的问题 =)
  • @rkosegi - 我想同时打开几个文件。这些文件是按顺序编号的,所以我想我可以遍历它们以同时打开它们。
  • 是的,你可以。它只是一个指针数组。

标签: c arrays pointers dynamic-allocation file-pointer


【解决方案1】:

您正在尝试实现有时称为弹性数组(或弹性数组)的东西,即在程序生命周期内动态改变大小的数组.) 这样的实体在 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_getfa_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 通常来说是一个好主意。相反,如果您将其大小增加一个恒定的增量,您将花费二次时间来复制数组的元素。

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

【讨论】:

  • 这很酷......但我的代码似乎适用于我的情况。这只是实现同一件事的另一种方式吗?
  • 使用callloc() 真的很奇怪,用无意义的清除(并且没有机会有效地增长块)而不是realloc(),这将包括接下来完成的复制。
  • @unwind:关于是否应该使用realloc,意见不一。它是通用的 allocate/grow/shrink/free 函数,对于单个入口点来说可能有点多。也就是说,我自己不会在这样的代码中使用calloc,我会使用malloc(或者,也许是realloc)。
  • 感谢@JimBalter 的一些修复。
  • @Kitchi:至少在你的帖子中,我只看到fptr 的一份作业。你如何选择给callocn?如果您最终需要的 FILE * 值比最初分配的空间多,会发生什么?在这种情况下,您需要以某种方式增加数组,这看起来就像我在此处显示的代码。
【解决方案2】:

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

【讨论】:

  • @Joseph :是的,当然..我的意思是实际上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 2013-05-26
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多