如何正确重新分配?
How to realloc properly?
我为 return 一个由给定程序的输入组成的字符串编写了一个小函数,它工作正常,直到我用恒定大小换取动态内存分配。
在我用一些 printf() 测试之后看起来程序在调用 realloc() 时崩溃了。
我是在使用 realloc() 做错了什么,还是其他原因?
char* get_line()
{
size_t ptr_pos = 0, size = 50;
int c;
char* line = malloc(size * sizeof *line);
char* temp;
while((c = getchar()) != EOF)
{
if(++ptr_pos >= size)
{
size += 50;
temp = realloc(line, size * sizeof *line); // The program crashes on this intruction.
if(temp != NULL)
{
line = temp;
printf("Reallocation success.\n");
}
else
{
printf("Reallocation error.\n");
free(line);
exit(1);
}
}
*line++ = c;
if(c == '\n')
break;
}
if(ptr_pos == 0)
return NULL;
*line = '[=10=]';
return line - ptr_pos;
}
感谢您的帮助。
当你调用realloc
时,你必须给它分配内存的起始地址,与malloc
最初返回的地址相同。 free
.
也是如此
但是你修改了line
的值,所以调用realloc
时它不再指向块的开头。
那是未定义的行为,因此绝对有可能出现段错误。
我为 return 一个由给定程序的输入组成的字符串编写了一个小函数,它工作正常,直到我用恒定大小换取动态内存分配。
在我用一些 printf() 测试之后看起来程序在调用 realloc() 时崩溃了。
我是在使用 realloc() 做错了什么,还是其他原因?
char* get_line()
{
size_t ptr_pos = 0, size = 50;
int c;
char* line = malloc(size * sizeof *line);
char* temp;
while((c = getchar()) != EOF)
{
if(++ptr_pos >= size)
{
size += 50;
temp = realloc(line, size * sizeof *line); // The program crashes on this intruction.
if(temp != NULL)
{
line = temp;
printf("Reallocation success.\n");
}
else
{
printf("Reallocation error.\n");
free(line);
exit(1);
}
}
*line++ = c;
if(c == '\n')
break;
}
if(ptr_pos == 0)
return NULL;
*line = '[=10=]';
return line - ptr_pos;
}
感谢您的帮助。
当你调用realloc
时,你必须给它分配内存的起始地址,与malloc
最初返回的地址相同。 free
.
但是你修改了line
的值,所以调用realloc
时它不再指向块的开头。
那是未定义的行为,因此绝对有可能出现段错误。