gpt4 book ai didi

c - 使用 ANSI C 的动态数组

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:09 24 4
gpt4 key购买 nike

我有一个字符数组

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

最后如何添加一些额外的项目呢? 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;
}

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

要增大数组,可以使用 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请求 block 。这就是为什么需要 if 语句的原因。我从您的示例中稍微缩减了初始大小,以减少所需的赋值行数,从而使示例更短。

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

关于c - 使用 ANSI C 的动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8338431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com