我只是想知道我是否可以在C中的列表中添加/追加元素,我会去做它吗?
e.g。
int numbers[6] = {5,3,5,1,3,6}
让我们说我想在数组中添加另一个数字'数字',我该怎么做?
答案 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。