【发布时间】:2021-11-01 23:34:37
【问题描述】:
我只是在试验,想知道为什么我的尝试没有奏效(程序崩溃)。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *list;
list = (char*)malloc(sizeof(char));
char a;
int i = 0;
while ( (a =getchar()) !='\n'){
list[i]= a;
list = (char*)realloc(list,sizeof(char));
++i;
}
printf("%s",list);
free(list);
return 0;
}
【问题讨论】:
-
可以,但要记住两点:首先,C 中的字符串实际上称为 null-terminated 字符串,意思是字符串的
x元素需要x + 1字符的空间以适应终止符(当然,您需要添加);第二件事是提供给realloc的大小是new 大小,以字节为单位。不是要添加多少内存。 -
请注意
getchar()returns anint并且您应该考虑 EOF 以及换行符:int a; … while ((a = getchar()) != EOF && a != '\n')。您也应该在printf()语句中的格式字符串中添加一个换行符。最好避免重复地将缓冲区中分配的空间量增加一——这会变得很昂贵。跟踪分配的数量,从小分配(比如 4 个字节)开始,当您需要更多空间时将大小加倍。输入完成后,您可以释放多余的部分。 -
感谢您的 cmets
-
Afzel 还有一件事是一个好习惯,我没有将其包含在答案中,因为它没有回答您的直接问题。这总是需要很长时间才能咬我们,到时候我们已经养成了坏习惯。如果在获取更多内存时出现问题,malloc 和 realloc 可以返回 null。所以你永远不应该假设这些命令有效。您不需要在所有代码中添加空检查。每当我想释放时,我都会使用 malloc 和“析构函数”来制作“构造函数”,后者对于链表和嵌套结构特别有用。
-
不要强制转换 malloc 返回的值:stackoverflow.com/questions/605845/…
标签: c string malloc realloc getchar