C

时间:2018-12-17 20:41:12

标签: c vector struct

我想在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 );
}

我是在正确的道路上吗,还是有更好的方法来创建可增长的数组?

1 个答案:

答案 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的数组。