我有一个char数组
char *data[]= {"11", "22", "33", "44", "55"};
Run Code Online (Sandbox Code Playgroud)
我怎样才能在最后添加一些额外的物品? data[]="66";
我想在C中使用动态数组.
谢谢
使用[]语法创建的数组不是动态的,长度是在编译时设置的,不能更改.
更新:实际上,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需要陈述的原因.我将示例中的初始大小缩小了一点,以减少所需的赋值行数,从而缩短示例.
为了使上述更有效,典型的动态数组代码使用两个长度值:一个用于实际数组(现在数组中有多少个值),另一个用于内存(我们有多少值存储空间).通过使后一个值以块的形式增长,内存分配的总数可以减少一点,当然会以某些内存为代价.