有没有办法将元素添加到列表/数组? [C]

时间:2015-01-02 01:43:22

标签: c arrays list

我只是想知道我是否可以在C中的列表中添加/追加元素,我会去做它吗?

e.g。

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

让我们说我想在数组中添加另一个数字'数字',我该怎么做?

4 个答案:

答案 0 :(得分:6)

嗯,原始数组需要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);
}

答案 1 :(得分:1)

您需要使用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将提供未定义的行为,因为尚未分配内存。

答案 2 :(得分:1)

最简单的解决方案可能是制作一个比声明时要大的数组。

您的示例数组有六个元素,因此可能会将数组声明为长度为8。这足以允许另外两个元素添加&#34;。您必须跟踪数组的实际长度和它包含的相关元素的数量(分别为8和6)。

如果你想&#34;添加&#34;第三个元素然后你必须创建一个新的数组。新阵列的长度可能是前一个阵列的两倍(十六个)。将前一个数组的所有元素复制到新数组,然后&#34;添加&#34;新元素。

答案 3 :(得分:0)

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

如果您只需要一个列表,那么FreeBSD queue primitives可能是一个很好的起点,它们提供单链接和双链接列表。代码是单个标头file。如果有的话,它会显示如何实现强大的列表/队列原语。

有各种用于收集管理的库,例如GTK/Glib,但这可能会带来一些您可能需要或可能不需要的其他问题。

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