C中的Strdup和不必要的内存分配

问题描述

在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;
}

(具体取决于条件)