我想在C中创建一个ArrayList或Vector。也许我可以了解我是在正确的路径上还是完全偏离基础
因此,如果我有一个ArrayList Struct,其中包含一个初始设置为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 );
}
我是在正确的道路上吗,还是有更好的方法来创建可增长的数组?
答案 0 :(得分:1)
您的方法不好,因为它涉及将结构复制到临时原始数组中。
一个很好的解决问题的方法是所谓的灵活数组。 Google以获得更多信息。基本上看起来像这样。
Set wsDriver as wb.worksheets("Scan List")
Set wsSrc = wb.worksheets("SourceData")
Set wsDest = anotherworkbook.worksheets("December Output")
要使用它,请始终按以下说明将其声明为指针
struct my_fam_array_t {
int arr_size;
int arr[];
};
然后按如下所示对其进行初始化:
struct my_fam_array_t *arr5;
fam_size应该是数组所需的大小。
还有两件事,不要忘记在结构中设置数组的大小,并检查内存分配状态并处理任何错误。
使用后请不要忘记释放它。
您现在可以正常使用数组,例如
arr5 = malloc(sizeof(struct my_fam_array_t) + fam_size));
您现在可以创建一个函数来调整数组的大小。我不会写它,但是要做的是:
m分配具有新大小的新结构
将旧数组复制到新结构中
别忘了释放旧阵列
考虑到您是初学者,这可能是新手,但是灵活的数组是您需要的工具。
顺便说一句,您也可以使用realloc并对其进行阅读,这可能会很有用,但是要非常小心地正确处理内存不足故障。 Google关于realloc和SEI CERT C标准
编辑:
确保使用C99或更高版本。相反,您必须使用数组大小为1的结构,并且应从malloc大小中减去1。如果您的编译器支持此扩展,则可以使用大小为0的数组。