问题描述
在Unix的C程序中,我正在处理从标准输入(buf
)接收的字符数组。我需要计算用空格隔开的单词数,然后将它们另存为向量中的单独单词。
在我的代码中,这些行如下:char * buftmp = strdup(buf);
复制单词,strtok(buftmp," ");
在空格之间分隔单词。
然后,一旦我用完buftmp,就用free(buftmp)
释放内存,(因为它在strtok
之后不再有我想要的单词了)
但是,稍后,我需要再次遍历buf
,所以我再次具有相同的命令:char * buftmp = strdup(buf);
复制单词。
据我了解,strdup
总是有必要释放内存,即使我不是一开始就分配内存。
但是,这似乎是一种浪费,因为我需要与已经分配的内存数量完全相同的内存。
真的有必要在这些分配之间释放内存吗?有什么办法解决吗?
解决方法
有几种方法可以重用相同的内存(例如,将free
+ strdup
替换为strcpy
),但是我建议通过计数来完全避免所有这些以空格分隔的单词,不会改变您的输入(因此,strtok
不会)。这样就不需要任何分配。
类似的东西:
static size_t count_words(char const* str) {
bool was_word = false;
size_t words = 0;
for (char c; c = *str++;) {
bool is_word = c != ' ';
if (is_word && !was_word) {
words++;
}
was_word = is_word;
}
return words;
}
(具体取决于条件)