【发布时间】:2016-03-11 03:20:53
【问题描述】:
我写了一个小函数来返回一个由给程序的输入生成的字符串,它工作正常,直到我用常量大小换取动态内存分配。
在我用一些 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 = '\0';
return line - ptr_pos;
}
感谢您的帮助。
【问题讨论】:
-
malloc()和realloc()返回void *。您直接将它们用作char *。显式转换它们。 -
您可能希望将
*line++ = c;替换为line[ptr_pos - 1] = c;。 -
@Pawan:这不是必要的,在 C 中也不推荐。C 不是 C++。
-
@Pawan c - Do I cast the result of malloc? - Stack Overflow - 没有。
-
@alk "你可能想用
line[ptr_pos - 1] = c;替换*line++ = c;" 。现在我已经阅读了 rici 的回答,我明白为什么这会抑制错误,好点。
标签: c memory-management realloc