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
的指针的大小
感谢您的阅读,非常感谢您的帮助:)
编辑:谢谢大家的回复;我现在没有时间阅读所有答案,但一旦这个即将到来的最后期限过去,您的所有答案都将被更彻底地阅读和理解:Drealloc()
通常会发现没有足够的可用空间来扩展现有阵列;在这种情况下,它将创建一个指定大小的全新数组,将旧数组的内容复制到新数组,取消分配旧数组,并返回指向新数组的指针。所以你应该写
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
。一旦失败,它就不会
触摸旧内存,成功后,它将在复制后释放
将您的数据保存到新位置
那么,去哪里呢