更新
鉴于您正在对字符串进行分块(将其分成单词),您可以计算空格的数量,从而了解您需要多大的数组:
char givenString[] = "The quick brown fox jumps over the lazy dog";
int i;
for (i=0;givenString[i];givenString[i] == ' ' ? ++i : givenString++);
++i;// + 1 for the last word
现在i 将告诉您给定字符串中有多少个单词。然后你可以简单地做:
char **words = malloc(i*sizeof(char *));
然后开始您的业务。当然,您仍然必须分配每个字指针,并释放它。也许这是strtok 的一个不错的用例,顺便说一句:
//assuming i still holds the word-count
words[0] = strtok(givenString, " ");//
for (int j=1;j<i;++j)
{
words[j] = strtok(NULL, " ");
}
不过,如果您要进行大量此类字符串拆分业务,您可能需要查看 strtok_r。
您可以为此使用realloc。 realloc 更改给定指针指向的内存块的大小。如果指针指向NULL,则realloc 的行为类似于malloc
char **ptr_array = NULL;
for (int i=1;i<argc;++i)
{
ptr_array = realloc(ptr_array, i*sizeof(char *));
ptr_array[i-1] = calloc(strlen(argv[i]) + 1, sizeof(char));
strncpy(ptr_array[i-1], argv[i], strlen(argv[i]));
}
此代码会将所有参数复制到堆内存中,并为所需的内存一一分配内存。不要忘记free 电话,请注意!
这是一个完整的示例(包括free-calls)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char **ptr_array = NULL;//pointer to pointers
int i, argc = 5;//fake argc, argv
char *argv[5] = {"me","foo","bar","zar", "car"};//dummy strings
for (i=1;i<argc;++i)
{
ptr_array = realloc(ptr_array, i*sizeof(char *));//(re-)allocate mem
ptr_array[i-1] = calloc(strlen(argv[i]) + 1, sizeof(char));//alloc str
strncpy(ptr_array[i-1], argv[i], strlen(argv[i]));//copy
}
--argc;
for(i=0;i<argc;++i)
{
printf("At index %d: %s\n", i, ptr_array[i]);//print
free(ptr_array[i]);//free string mem
}
free(ptr_array);//free pointer block
return 0;
}
我已经测试了这段代码,结果如你所料:
在索引 0:foo
在索引 1:bar
在索引 2:zar
在索引 3:汽车