我需要在填充过程完成之前用一些我不知道的对象填充c数组。
这是一个字符串数组。 另外一个补充:我把一个字符串分成了它的单词,所以我知道字符串的大小。云这有助于猜出正确的大小?
我需要有类似可变数组的东西。
我怎样才能做到这一点?
答案 0 :(得分:1)
您可以使用realloc
声明数组并在需要时更改其大小。
myStrArray = realloc(myStrArray, MaxArray * sizeof(char*));
在大多数情况下,Realloc将返回相同的内存块,直到它“满”,然后它会将内存和内容移动到其他地方。
请注意,这是指针的数组,因此需要为其分配或分配字符串本身。要为第一个元素分配100个字符串,例如:
myStrArray[0] = calloc(100, sizeof(char));
始终使用free
(realloc,calloc,malloc)释放已分配的内存。
答案 1 :(得分:1)
更新
鉴于你正在对字符串进行分块(将其分成单词),你可以计算出空格的数量,让你知道你需要多大的数组:
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
,BTW:
//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
- 调用)
#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:汽车
答案 2 :(得分:0)
由于您不知道先验数组的大小,您必须使用malloc()
为数组及其中包含的字符串动态分配内存。 />
然后,您必须使用free()
在不再需要时释放此内存。
为了获得良好的局部性,考虑到像double-NUL terminated strings这样的数据结构,您可能希望为数组中的字符串分配一块内存。