【发布时间】:2011-08-01 22:25:15
【问题描述】:
对于一个作业,我必须做的一部分是使用malloc 和realloc。我首先创建一个二维字符数组,维度是行数和字符数。然后我使用malloc 分配足够的内存来存储来自某个文件的输入。使用fgets 我一次读入一行,并将其存储在数组中。这部分工作正常(或者我认为)。当我尝试为更多行重新分配内存时,问题就出现了。程序流程应该是这样的:
创建一个 50 行的字符数组,每行 80 个字符(工作)
使用fgets 一次读取一行并将其保存到数组中(工作)
读取 50 行后,重新分配数组以允许 100 行(不工作)
根据需要继续重新分配(不工作)
这是我目前所拥有的(至少是它的核心,我省略了不相关的代码):
#define NUMBER_OF_LINES 50
#define CHARACTERS_PER_LINE 80
FILE *inputFile = fopen("some.text", "r");
char **lines;
lines = malloc(NUMBER_OF_LINES * sizeof(*lines));
int i;
for (i = 0; i < NUMBER_OF_LINES; i++)
*(lines+i) = malloc(CHARACTERS_PER_LINE * sizeof(char));
int linesRemaining = NUMBER_OF_LINES;
int reallocCount = 1;
i = 0;
while (!feof(inputFile)) {
if (!linesRemaining) {
reallocCount++;
lines = realloc(lines, (NUM_OF_LINES * reallocCount) * sizeof(*lines));
linesRemaining = NUM_OF_LINES;
}
fgets(*(lines+i), CHARS_PER_LINE, inputFile);
i++;
linesRemaining--;
}
我的直觉告诉我问题出在realloc,所以我将解释我认为它在做什么。
realloc(lines, (NUM_OF_LINES * reallocCount) * sizeof(*lines));
第一个参数lines 是我想重新分配一定数量内存的指针。 NUM_OF_LINES 是我想增加大小的数量。我将它乘以reallocLinesCount,这是一个计数器,用于跟踪我应该拥有多少组 50 行。 sizeof(*lines) 部分是指向char 的指针的大小。
感谢您的阅读,非常感谢您的帮助:)
编辑:谢谢大家的回复;我现在没有时间阅读所有答案,但是一旦这个迫在眉睫的截止日期过去,您的所有答案都会得到更彻底的阅读和理解:D
【问题讨论】:
-
前/后增量/减量绊倒了许多新手 C 程序员;编写没有它们的代码,然后在获得经验时介绍它们。
-
我永远无法理解这种奇怪的恋物癖老师必须教学生静态分配特定长度的数组。就像他们正在尝试培养下一代容易被黑客入侵的软件编写者..
-
编辑为没有前/后增量/减量。