首页 > 解决方案 > 在C中按块重新分配char数组(字符串)

问题描述

如果我使用块来重新分配内存,比方说,我使用 C 中的 getchar() 函数从控制台读取的每十个字符,并使用 counter++ 计算每个新字符(位置),当我完成我的单词时,如果我将 '\0' 添加到数组中的最后一个位置(由计数器标记),我会摆脱多余的分配空间吗?

例如,如果我希望输入是人的姓名和姓氏(新行表示我正在处理的字符串数组中的新字符串):
Anna Johnson
Mark Twen
Gabe Michaelson

“Mark Twen”是 9 个字符,我在字符串末尾再添加一个,我已经用完了分配块中的所有 10 个位置。但是“Gabe Michaelson”是 15 个字符,如果我在第 16 位添加 '\0'(从 1 开始计数;或第 15 位,从 0 开始计数),我会浪费(泄漏???)由 4 个剩余未使用位置表示的内存,或者字符串数组中的每个字符串是否都有自己的长度而没有任何泄漏/然后需要使用更多的内存?

标签: carraysstringcharrealloc

解决方案


不,添加\0不会以任何方式释放空间或影响其余内存。实际上,如果您以后想要向字符串中添加更多字符,您可以这样做,直至分配的空间量。

如果你真的想在最后释放内存,唯一的办法就是把realloc它变小。但是,对于几个字节,这可能不会有太大帮助,因为malloc不太可能能够使用这么小的块,特别是考虑到每个块通常有很多字节的开销。因此,如果您的块大小相对较小,最好不要管它,并接受一些字节将被浪费 - 在大多数情况下它应该是微不足道的。

这并不是真正的泄漏,因为当您最终free()使用“Gabe Michaelson”字符串时,最后未使用的字节也将被释放。


推荐阅读