我想用 C 创建一个 ArrayList 或 Vector。也许我可以了解我是否走在正确的道路上或完全偏离基地
因此,如果我有一个 ArrayList 结构,其中包含一个数组(最初设置为 10),以及一个计数器来跟踪数组列表中已填充了多少元素,就像这样
typedef struct ArrayList
{
int counter;
int arr[10];
}
数组 arr 是否可以替换为另一个两倍于原始数组大小的数组?如果是这样,我该怎么做?
我在 add() 函数中有以下代码
if ( arrList->counter == (sizeof(arrList->arr)/sizeof(int)) )
{
int tempArray[((arrList->counter + 1) * 2)];
for (int i = 0; i < arrList->counter; i++)
{
tempArray[i] = arrList->arr[i];
}
strcpy( arrList->arr, tempArray );
}
我走在正确的道路上还是有更好的方法来创建可增长的数组?
最佳答案
您的方法不太好,因为它涉及将结构复制到临时原始数组。
对于您所遇到的问题,一个非常好的解决方案是所谓的灵活数组。谷歌它以获取更多信息。它基本上看起来像这样。
struct my_fam_array_t {
int arr_size;
int arr[];
};
要使用它,您始终将其声明为指针,如下所示
struct my_fam_array_t *arr5;
然后按如下方式初始化它:
arr5 = malloc(sizeof(struct my_fam_array_t) + fam_size));
其中 fam_size 应该是您需要的数组大小。
还有两件事,不要忘记在结构中设置数组的大小,还要检查内存分配状态并处理任何错误。
使用后不要忘记释放它。
您现在可以正常使用该数组,例如
arr5->arr[3] = some_value;
您现在可以创建一个函数来调整数组的大小。我不会写它,但应该做的是:
malloc 具有新大小的新结构
将旧数组复制到新结构中
不要忘记释放旧数组
考虑到您是初学者,这对您来说可能是新的,但是灵活的数组是您需要的工具。
顺便说一下,您也可以使用 realloc,阅读一下它,它可能有用,但是要非常小心,正确处理内存不足故障。 Google 关于 realloc 和 SEI CERT C 标准
编辑:
确保您使用 C99 或更高版本。相反,您必须使用数组大小为 1 的结构,并且应从 malloc 大小中减去 1。如果您的编译器支持此扩展,您可以使用大小为 0 的数组。
关于c - C 中的 vector 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53822685/