有没有办法向 list/array 添加元素? [C]

Is there a way to add elements to a list/array? [C]

我只是想知道我是否可以将 add/append 个元素添加到 C 中的列表中,我会四处做吗?

例如

int numbers[6] = {5,3,5,1,3,6}

假设我想向数组 'numbers' 添加另一个数字,我该怎么做?

您需要使用 realloc

void *new_array = realloc(old_array, new_array_size);
if (!new_array_size) {
  // check for error with realloc
}
old_array = new_array;   

这是 std::vector 的一个非常基本的实现。有关 realloc 的更多信息,请参阅 here

此答案适用于在 C 中扩展数组的更一般情况。它假定您已使用 malloc, calloc, etc. 生成数组。如果不是 realloc 将给出未定义的行为,因为尚未分配内存。

嗯,原始数组需要malloc,而不是在堆栈上。然后你可以使用 realloc:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int * numbers = malloc(6*sizeof(int));

    for(int ii = 0; ii < 6; ++ii) {
        numbers[ii] = 5;
    }

    numbers = realloc(numbers, 7*sizeof(*numbers));
    if(!numbers) {
        printf("Memory allocation failed, sorry dude!\n");
        exit(1);
    }

    numbers[6] = 7;

    for(int ii = 0; ii< 7; ++ii) {
        printf("%d\n", numbers[ii]);
    }

    free(numbers);
}

最简单的解决方案可能是创建一个比声明时需要的数组更大的数组。

您的示例数组有六个元素,因此数组的长度可能会被声明为八。这足以让另外两个元素成为 "added"。您必须跟踪数组的实际长度和它包含的相关元素的数量(分别为八个和六个)。

如果您想 "add" 第三个元素,则必须创建一个新数组。新数组的长度可能是前一个数组长度的两倍(十六)。将前一个数组的所有元素复制到新数组,然后 "add" 新元素。

该数组是固定大小的,只能通过 realloc 或 malloc/memcpy 扩展,正如其他人已经说过的那样。有多种方案可以提高效率,通常需要使数组不透明并由一组函数操作。

如果您只需要一个列表,那么 FreeBSD queue primitives are probably a good place to start, they provide single and doubly linked lists. Code is a single header file。如果有的话,它展示了如何实现一个健壮的 list/queue 原语。

有各种用于馆藏管理的库,例如 GTK/Glib,但随之而来的是您可能需要或不需要的一大堆其他问题。

如果您不介意将语言推向极限,那么高级功能 C 的终极可能是 libCello