如何解决使用 Fgets 进行 malloc
我希望得到一些代码方面的帮助,我需要从键盘输入一首给定的诗,并对每一行使用动态内存分配。我已经开始了我认为的一般想法,但我遇到了分段错误。
{{1}}
解决方法
这里有些地方需要改进。
1) 首先,您会遇到分段错误,因为您的内存分配不正确。由于数组实际上只是指向第一个元素的指针(即在 char myArray[10];
中,myArray 计算为 &myArray[0]),因此要创建二维数组,您必须
首先创建一个指针数组。然后,您可以执行您已经完成的操作,即为 poemLines[i] 的每个索引处的字符数组分配内存。
要创建指针数组,先做
char ** poemLines = malloc(INIT_CAPACITY * sizeof(*poemLines));
其中 INIT_CAPACITY 是您使用的任意初始容量。
2) 首先,您执行 malloc 的方式不被认为是正确的方式。正确的做法是
poemLines[i] = malloc(20 * sizeof(*poemLines[i]));
第二,您的程序不适用于任意大小的诗行,因为您将每个字符数组的大小设为 20。在您的情况下,因为您使用的是 fgets() 存储换行符字符在诗结束时,您的行最多可以是 18 个字符。第 19 个和第 20 个字符将分别用于换行符和空终止符。 要使其适用于任何大小的诗行,请执行
poemLines[i] = malloc((strlen(poemEnd) + 1) * sizeof(*poemLines[i]));
3) 这里有更多的旁注,但我之前提到过 fgets 存储换行符,我不确定您是否知道(很多 C 初学者不知道)。如果您输入的一行是
This is line 1 of my poem
在您的诗歌结束缓冲区数组中,它将存储为
"This is line 1 of my poem\n"
如果这是你想要的,那就留下吧。如果没有,有多种方法可以摆脱换行符。
4) 最后一件事是,如果您的程序需要处理任意行数的诗,那么动态数组可能会使事情变得更加复杂,因为您可能需要调整大小。但是,如果没有,只需为您的二维数组选择一些非常大的初始容量,例如 100,这样您的数组就可以容纳 100 行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。