realloc家庭作业帮助

realloc家庭作业帮助,c,realloc,C,Realloc,对于作业,我必须做的部分工作包括使用malloc和realloc。我首先创建一个字符的2D数组,维度是行数和字符数。然后我使用malloc分配足够的内存来存储来自某个文件的输入。使用fgets我一次读取一行,并将其存储在数组中。这部分很好(我想是这样)。如果需要,当我尝试重新分配更多行的内存时,问题就出现了。程序流程应该是这样的: 创建一个50行的字符数组,每行80个字符(工作) 使用fgets一次读取一行并将其保存到数组(工作) 读取50行后,重新分配阵列以允许100行(不工作) 根据需要继续

对于作业,我必须做的部分工作包括使用
malloc
realloc
。我首先创建一个字符的2D数组,维度是行数和字符数。然后我使用
malloc
分配足够的内存来存储来自某个文件的输入。使用
fgets
我一次读取一行,并将其存储在数组中。这部分很好(我想是这样)。如果需要,当我尝试重新分配更多行的内存时,问题就出现了。程序流程应该是这样的:

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

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

读取50行后,重新分配阵列以允许100行(不工作)

根据需要继续重新分配(不工作)

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

第一个参数,
lines
,是我想要重新分配一定内存量的指针
NUM\u OF_line
是我希望增加大小的数量。我将其乘以
realloclinescont
,这是一个计数器,用于跟踪我应该拥有多少组50行。
sizeof(*line)
部分是指向
char
的指针的大小

感谢您的阅读,非常感谢您的帮助:)

编辑:谢谢大家的回复;我现在没有时间阅读所有答案,但一旦这个即将到来的最后期限过去,您的所有答案都将被更彻底地阅读和理解:D

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

char **oldLines = lines;
lines = realloc(...);
(根据@Brian L的提示,
oldLines
的目的是保持原始指针,以防
realloc()
耗尽内存并返回
NULL

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

char **oldLines = lines;
lines = realloc(...);

(根据@Brian L的提示,
oldLines
的目的是在
realloc()
耗尽内存并返回
NULL
的情况下保持原始指针)。

这就是您应该如何realloc:

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.
}
详情请阅读

编辑


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

这是您应该如何重新分配的:

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.
}
详情请阅读

编辑

你需要为每一条新线路分配更多的资金。

我的座右铭是:“说出你的意思”。在您的情况下,您的意思是在阵列不够大无法容纳数据时扩大阵列

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);
}
我的座右铭是:“说出你的意思”。在您的情况下,您的意思是在阵列不够大无法容纳数据时扩大阵列

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);
}

您正在为行分配更多指针,但不是行本身。它在代码的开头:

for (i = 0; i < NUMBER_OF_LINES; i++)
   *(lines+i) = malloc(CHARACTERS_PER_LINE * sizeof(char));
for(i=0;i

因此,在为每行分配了行数之后,就为行本身分配了空间。重新分配时,您忘记对新行执行此操作。

您正在为行分配更多指针,但不是行本身。它在代码的开头:

for (i = 0; i < NUMBER_OF_LINES; i++)
   *(lines+i) = malloc(CHARACTERS_PER_LINE * sizeof(char));
for(i=0;i
因此,在为每行分配了行数之后,就为行本身分配了空间。重新分配时,您忘记对新行执行此操作。

我们先来看看。它返回一个指向新对象的指针 成功时为内存,失败时为
NULL
。一旦失败,它就不会 触摸旧内存,成功后,它将在复制后释放 将您的数据保存到新位置

因此,安全使用
realloc()
的方法是:

/* allocate memory using malloc() */
ptr = malloc(N * sizeof *ptr);
/* make sure malloc succeeded */
...
/* call realloc() */
new_ptr = realloc(ptr, M * sizeof *new_ptr);
/* see if it succeeded */
if (new_ptr) {
    /* okay, we can set ptr */
    ptr = new_ptr;
} else {
    /* realloc failed, old pointer still valid */
}
因此,第一件事是您使用的
realloc()
不正确。 你不应该说
x=realloc(x,…),因为如果
realloc()
如果失败,您将
x
分配给
NULL
,旧内存将丢失。这是 内存泄漏

现在,谈谈你的问题。假设您已成功阅读
行数
行数。现在你想为一个额外的
行数
行数。你会做:

char **new_lines = realloc(lines, NUMBER_OF_LINES*reallocCount*sizeof *new_lines);
if (new_lines) {
    lines = new_lines;
} else {
    fprintf(stderr, "realloc failed!\n");
    return;
}

/* Now, lines[NUMBER_OF_LINES] to lines[2*NUMBER_OF_LINES-1] are
 * available to point someplace useful.  They don't point anywhere
 * useful yet.  We have to allocate memory for them, just like earlier */

start = NUMBER_OF_LINES*reallocCount;
for (i=0; i < NUMBER_OF_LINES; ++i) {
    /* You weren't allocating memory here, and were writing to
     * lines[0] through lines[NUMBER_OF_LINES-1], which is not what
     * you want. */
    lines[start+i] = malloc(CHARS_PER_LINE * sizeof *lines[start+i]);
    /* check the result of malloc here */
}
fgets(lines[start+i], CHARS_PER_LINE, inputFile);
char**new\u lines=realloc(行、行数*reallocCount*大小*新行);
如果(新线路){
线=新的线;
}否则{
fprintf(标准,“realloc失败!\n”);
返回;
}
/*现在,第[u行的数量]到第[2*u行的数量-1]行是
*可以指向某个有用的地方。它们没有指向任何地方
*还有用。我们必须为它们分配内存,就像之前一样*/
开始=行数*reallocCount;
对于(i=0;i
最后一个注意事项:使用
while(!feof(fp))
从文件中读取行。

我们先来看看。它返回一个指向新对象的指针 成功时为内存,失败时为
NULL
。一旦失败,它就不会 触摸旧内存,成功后,它将在复制后释放 将您的数据保存到新位置

那么,去哪里呢