对于一项任务,我必须做的部分工作涉及到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的指针的大小。
谢谢你的阅读,任何帮助都是非常感谢的:)
编辑:谢谢大家的回复;我现在没有时间去阅读所有的答案,但是一旦这个即将到来的截止日期过了,你们所有的答案都会被更彻底的阅读和理解。
发布于 2011-04-09 02:55:32
我的座右铭是:“说你的意思”。在这种情况下,当数组不足以容纳数据时,就意味着要放大数组。
FILE *in; // you fill this in
int nlines=50; // initial value
char **buffer=malloc(nlines * sizeof *buffer);
int i=0;
for(int i=0; !feof(in); ++i)
{
if(i>=nlines)
buffer=realloc(buffer, (nlines+=50)*sizeof *buffer);
buffer[i]=malloc(80);
fgets(buffer[i], 80, in);
}发布于 2011-04-09 02:52:47
realloc()通常会发现没有足够的可用空间来扩展现有数组;在这种情况下,它将创建一个指定大小的全新数组,将旧数组的内容复制到新数组,释放旧数组,并返回指向新数组的指针。所以你应该写
char **oldLines = lines;
lines = realloc(...);( oldLines的目的是保存原始指针,以防realloc()耗尽内存并返回NULL,正如@Brian的提示所示)。
发布于 2011-04-09 02:54:50
以下是您应该如何实现的:
char **new_lines = realloc(lines, (NUM_OF_LINES * ++reallocLinesCount) * sizeof(*lines));
if (new_lines)
{
lines = new_lines;
}
else
{
// Memory allocation fails. Do some error handling.
}详细信息请阅读realloc参考。
编辑
您需要为每个新行分配更多的资源。
https://stackoverflow.com/questions/5602570
复制相似问题