c - 在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 个剩余未使用位置表示的内存,或者字符串数组中的每个字符串是否都有自己的长度而没有任何泄漏/然后需要使用更多的内存?
解决方案
不,添加\0
不会以任何方式释放空间或影响其余内存。实际上,如果您以后想要向字符串中添加更多字符,您可以这样做,直至分配的空间量。
如果你真的想在最后释放内存,唯一的办法就是把realloc
它变小。但是,对于几个字节,这可能不会有太大帮助,因为malloc
不太可能能够使用这么小的块,特别是考虑到每个块通常有很多字节的开销。因此,如果您的块大小相对较小,最好不要管它,并接受一些字节将被浪费 - 在大多数情况下它应该是微不足道的。
这并不是真正的泄漏,因为当您最终free()
使用“Gabe Michaelson”字符串时,最后未使用的字节也将被释放。
推荐阅读
- java - 如何将方法中的填充数组中的值返回到 main 中的参差不齐的数组
- python - 如何在 python opencv 中读取带有 alpha 通道的 GIF?
- heroku - 我猜是与 Heroku Captcha 相关的错误。附加日志
- java - 将扫描仪的控制台输入传递给 java 对象,找不到符号错误
- javascript - 如何将对象名称传递给等待对象启动的 JavaScript 承诺?
- python - Python 类递归属性装饰器
- cordova - 离子科尔多瓦应用程序说即使安装后也没有安装插件
- javascript - 我们可以跳过事件函数中的参数吗?
- javascript - 如何根据星期几更改目标文本的字体颜色?
- php - 完整性约束违规:1048 列“discussion_id”不能为空(SQL:插入“回复”