当我们不知道单词的确切数量和单词的长度时,如何以最有效的方式为char **分配内存?

时间:2014-09-05 17:14:41

标签: c pointer-to-pointer

我很好奇如何为char **分配内存,因为我不知道我将拥有多少单词以及单词的最大长度是多少。 我需要在多个标记(单词)上划分字符串(我得到char *)并在char **中保存单独的单词。 我明白我可以为* char分配大小为(字符串长度+ 1)和每个char [i]我也可以分配(字符串长度+ 1)< - 如果我们将整个sting作为一个令牌或我们将字符串中的每个字符作为单独的单词。 所以我认为代码是:

char **words = malloc((strlen(str)+1) * sizeof(char*));
int i;
for( i=0; i < strlen(str)+1; i++)
 words[i] = malloc((strlen(str)+1) * sizeof(char));

这是对的吗? 如果效率更高,我可以这样做吗?

2 个答案:

答案 0 :(得分:0)

只需运行一次strlen()并保存该变量,就可以加快速度。你也在分配超出你需要的方式。首先找出你有多少单词,然后按char **words分配,然后为每个单词words[i]分配足够的单词。

答案 1 :(得分:0)

您不需要分别为每个单词分配内存。相反,您可以使用strdup(str)(或malloc(strlen(str)+1)strcpy())复制整个字符串,并使用'\0'替换单词分隔符来修改副本(例如strtok()一样)。

关于最大字数:如果两个背对背分隔符要在它们之间形成一个空字,则可以有strlen(str)+1个字;如果两个或多个连续的分隔符字符被认为是单个分隔符,则只有一半的单词。