c - C 中的 vector 结构

标签 c vector struct

我想用 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/

相关文章:

c++ - 选择从 Windows 将文件拖放到 GLFW 应用程序中

c++ - 如何将 std::vector 的容量限制为元素的数量

c++ - 任何可用的实现,如 Loki 的 AssocVector,但具有 Boost 的 Bimap 的功能?

c - 从C中的堆栈中删除后数据仍在内存中

c - 将指向结构的指针设置为等于函数返回的另一个指向结构的指针?

c++ - 为什么这个结构的大小不正确

c++ - 结构/类数据对齐和填充算法?

c - 作为 switch 语句实现的菜单

c - 段错误 11 和在 c 中创建/打印字符串数组时出现问题

c++ - 如何使用循环将 vector 插入队列<vector<int>>?