首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >房地产作业帮助

房地产作业帮助
EN

Stack Overflow用户
提问于 2011-04-09 02:44:33
回答 5查看 527关注 0票数 1

对于一项任务,我必须做的部分工作涉及到mallocrealloc的使用。我首先创建一个二维字符数组,维度是行数和字符数。然后我使用malloc分配足够的内存来存储来自某个文件的输入。使用fgets,我一次读取一行,并将其存储在数组中。这部分工作得很好(至少我认为是这样)。如果需要的话,当我试图为更多的行重新分配内存时,问题就出现了。程序流应该是这样的:

创建一个50行字符数组,每行80个字符(工作)

使用fgets一次读取一行并将其保存到数组中(工作)

当读取50行时,重新分配数组以允许100行(不工作)

继续按需要重新分配(不起作用)

到目前为止,这就是我所拥有的(它的核心,至少,我省略了无关的代码):

代码语言:javascript
复制
#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的问题所在,所以我会解释一下我认为它在做什么。

代码语言:javascript
复制
realloc(lines, (NUM_OF_LINES * reallocCount) * sizeof(*lines));

第一个参数,lines,是我想重新分配一定数量内存的指针。NUM_OF_LINES是我想增加尺寸的数量。我把它乘以reallocLinesCount,它是一个计数器,可以跟踪我应该有多少组50行。sizeof(*lines)部件是指向char的指针的大小。

谢谢你的阅读,任何帮助都是非常感谢的:)

编辑:谢谢大家的回复;我现在没有时间去阅读所有的答案,但是一旦这个即将到来的截止日期过了,你们所有的答案都会被更彻底的阅读和理解。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-09 02:55:32

我的座右铭是:“说你的意思”。在这种情况下,当数组不足以容纳数据时,就意味着要放大数组。

代码语言:javascript
复制
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);
}
票数 2
EN

Stack Overflow用户

发布于 2011-04-09 02:52:47

realloc()通常会发现没有足够的可用空间来扩展现有数组;在这种情况下,它将创建一个指定大小的全新数组,将旧数组的内容复制到新数组,释放旧数组,并返回指向新数组的指针。所以你应该写

代码语言:javascript
复制
char **oldLines = lines;
lines = realloc(...);

( oldLines的目的是保存原始指针,以防realloc()耗尽内存并返回NULL,正如@Brian的提示所示)。

票数 2
EN

Stack Overflow用户

发布于 2011-04-09 02:54:50

以下是您应该如何实现的:

代码语言:javascript
复制
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参考

编辑

您需要为每个新行分配更多的资源。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5602570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档