使用ANSI C的动态数组

时间:2011-12-01 08:33:48

标签: c

我有一个char数组

char *data[]= {"11", "22", "33", "44", "55"};

我怎样才能在最后添加一些额外的物品? data[]="66";

我想在C中使用动态数组。

由于

3 个答案:

答案 0 :(得分:8)

使用[]语法创建的数组不是动态的,长度是在编译时设置的,不能更改。

UPDATE :实际上,C99添加了所谓的“可变长度数组”,它可以在运行时获得它们的长度。然而,在它们被初始化之后,它们不能缩小或扩展,所以下面仍然适用。

但是,当你有指针时,数组很简单:数组可以表示为指向第一个元素的指针和一个长度。

因此,您可以使用malloc()动态分配内存来创建新数组:

size_t array_length = 3;
int *array = malloc(array_length * sizeof *array);

if(array != NULL)
{
  array[0] = 11;
  array[1] = 22;
  array[2] = 33;
}

你不能在这里使用{}元素列表,这只能在初始化使用[]语法声明的数组时使用。

要扩展数组,可以使用realloc()函数重新分配内存并复制旧值:

size_t new_length = array_length + 1;
int *bigger_array = realloc(array, new_length * sizeof *bigger_array);

if(bigger_array != NULL)
{
  bigger_array[new_length - 1] = 44;
  /* We have successfully grown the allocation, remember the new address. */
  array = bigger_array;
  array_length = new_length;
}

请注意,每次调用malloc()(或realloc())时,如果无法分配请求的块,则可以返回NULL。这就是需要if语句的原因。我将示例中的初始大小缩小了一点,以减少所需的赋值行数,从而缩短示例。

为了使上述更有效,典型的动态数组代码使用两个长度值:一个用于实际数组(现在数组中有多少个值),一个用于内存(多少个)价值我们有空间存储)。通过使后一个值以块的形式增长,内存分配的总数可以减少一点,当然会以一些内存为代价。

答案 1 :(得分:1)

vc_vector

vc_vector* vector = vc_vector_create(0, sizeof(const char *), NULL);

vc_vector_push_back(vector, "11");
vc_vector_push_back(vector, "22");
vc_vector_push_back(vector, "33");

for (int i = 0; i < vc_vector_count(vector); ++i) {
  printf("%s ", (const char*)vc_vector_at(vector, i));
}

// output: 11 22 33

vc_vector_release(vector);

答案 2 :(得分:1)

Here是用于C中动态数组的基于宏的解决方案,使用的语法非常好。适用于任何数据类型。

#include <stdio.h>
#include <stdlib.h>
#include <wondermacros/array/dynamic_array.h>

int main()
{
  int* elems = NULL; /* Initialize a dynamic array. */
  W_DYNAMIC_ARRAY_PUSH(elems, 1, 2, 3, 4); /* Push some elements. */

  /* Iterate all elements. */
  W_DYNAMIC_ARRAY_FOR_EACH(int, e, elems) {
    printf("%d\n", e);
  }

  W_DYNAMIC_ARRAY_FREE(elems); /* Free the array only this way since there is a hidden header. */
}

library使用Boost pre-processor library,因此Boost库需要在构建时存在。