使用ANSI C的动态数组

lac*_*cas 1 c

我有一个char数组

char *data[]= {"11", "22", "33", "44", "55"};
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

unw*_*ind 8

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

更新:实际上,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;
}
Run Code Online (Sandbox Code Playgroud)

您不能在{}此处使用元素列表,这仅在初始化使用[]语法声明的数组时可用.

要增大数组,可以使用该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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 不知道`realloc`存在.你让我意识到过去几年我的生活会变得多么轻松. (2认同)