【问题标题】:Reallocating char array (string) by chunks in C在C中按块重新分配char数组(字符串)
【发布时间】:2020-08-07 13:36:47
【问题描述】:

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

例如,如果我想输入人的姓名和姓氏(新行表示我正在处理的字符串数组中的新字符串):
安娜·约翰逊
马克吐温
加布·迈克尔森

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

【问题讨论】:

  • 如果您只为所需的确切字符数分配存储空间 - 就不会浪费空间。为此,您需要分配指针,然后为需要存储的每个名称(strlen(name) + 1 字符)分配存储空间(单独的内存块)。然后,您将每个分配的存储名称的块的起始地址依次分配给每个指针。 (当您需要更多指针时,您只需 realloc 指针并继续前进)

标签: c arrays string char realloc


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您向我解释剩余字节的情况,我现在知道我可以尝试通过使用从计数器收集的信息将其重新分配到更小的大小来进一步升级我的解决方案。
猜你喜欢
  • 2011-02-07
  • 1970-01-01
  • 2018-01-30
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2022-10-06
  • 2012-11-10
相关资源
最近更新 更多