有没有办法向 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。
我只是想知道我是否可以将 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。