如何用未知数量的对象填充c数组

时间:2013-11-19 12:24:51

标签: c arrays

我需要在填充过程完成之前用一些我不知道的对象填充c数组。

这是一个字符串数组。 另外一个补充:我把一个字符串分成了它的单词,所以我知道字符串的大小。云这有助于猜出正确的大小?

我需要有类似可变数组的东西。

我怎样才能做到这一点?

3 个答案:

答案 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


您可以使用reallocrealloc更改给定指针指向的内存块的大小。如果指针指向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这样的数据结构,您可能希望为数组中的字符串分配一块内存。