【发布时间】:2016-12-20 20:02:41
【问题描述】:
我有格式字符串,我正在解析它而不是用输入参数替换格式说明符。现在我考虑在替换参数后如何为这样的结果字符串分配内存。我可以分配这个字符串,只要格式字符串,但不是用其他字符串代替
%s 任何长的都需要在一些不确定的融合中重新分配这个字符串,这使得有必要在代码中进行一些不雅的计算。
所以我想我可以按一个字符一个字符地分配从格式字符串创建的这个字符串,每次都重新分配它:
/*** for loop traversing next chars in format string ***/
// if new char
str = realloc(str, sizeof(*str) +1);
// if %s
str = realloc(str, sizeof(*str) + strlen(in_str));
// if %d
str = realloc(str, sizeof(*str) + strlen(d_str));
【问题讨论】:
-
这些陈述似乎不正确:
sizeof(*str)不是到目前为止分配的字符串的大小。 -
您可以创建一个轻量级的 String 类(对于 C,一个
struct),它包含一个当前的max_length(最初应该“对于大多数情况来说已经足够了”)。但是,它会增加大约相同的开销,因为您总是需要检查最大长度之前添加它。 -
模式
str = realloc(str,不允许从内存不足中恢复 -
这是一个坏主意(除了已经暗示的错误)。如果您对字符串大小有一个想法(例如“它永远不会超过 160、200、300 个字符”),那么您最好分配一个静态缓冲区,而不是不断地通过内存分配调用来打扰操作系统。根据系统的不同,内存浪费可能比操作系统开销更容易容忍。
-
您是否遇到了可以通过不重新分配字符串来解决的性能问题?如果是这样,那就不好了,你可以修复它。如果您没有遇到性能问题,请不要担心您调用了多少次
realloc()。