使用ANSI C的动态数组

我有一个char数组

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 。 这就是为什么需要if语句的原因。 我将示例中的初始大小缩小了一点,以减少所需的赋值行数,从而缩短示例。

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

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);