【发布时间】:2013-12-05 01:29:20
【问题描述】:
我担心加载大量字符串的 C99 应用程序的内存占用。我有字符串长度的上限,我基本上会做这样的事情(这个语句在循环中):
char* input = (char*)malloc(sizeof (char)* MAX_CHAR_INPUT_SIZE);
scanf_s("%s", input, MAX_CHAR_INPUT_SIZE);
如您所见,如果用户提供的字符串很小,则会浪费大量内存。我唯一的想法是在读取后将该字符串复制到大小合适的内存块,然后释放更大的内存块。这是好方法吗? (我知道这将是 O(N))。
也有人可以向我解释这是如何用高级语言解决的吗? (例如 C# 的 Console.Read())
【问题讨论】:
-
在其他语言中真的很常见将与变量关联的字符串的类型视为具有不可变状态的实例,这意味着如果用户需要修改状态(编辑字符串或关联与给定变量不同的字符串),创建一个新字符串(创建新字符串背后的逻辑显然取决于用户在做什么)并附加到标签上;这几乎就是它发生的方式。
-
其他具有可变字符串的语言(例如 StringBuilder,有时用于提高效率)将从较小的大小开始,然后在必要时增加。
-
c++ 中的字符串是可变的,并且应该以两倍的倍数指数增长。