如何在C中使用动态大小的数组创建结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C中使用动态大小的数组创建结构相关的知识,希望对你有一定的参考价值。

鉴于我有一个像这样的结构:

struct arr {
  int len;
  void *item[]; // still playing with this
};

typedef struct arr my_array;

我想知道你是如何初始化它的。

my_array foo = { 0, 1000 }; // 1000 spaces reserved.
// or perhaps...
my_array foo = { 0, [1000] };

因为当你有一个常规数组时,你指定这样的大小:

int anarray[1000];

所以我想你可以这样做来初始化上面数组结构中的指针值。

甚至会

foo->item[1000];

我不知道。想知道是否有可能这样的事情。

答案

灵活的数组成员仅在动态分配结构时才真正有用。如果静态地或自动地(即在堆栈上)分配结构,则分配的存储量是sizeof(struct arr),其在item中用0成员计算。没有语法来定义变量,其类型是具有灵活数组成员的结构,并指定该数组的大小。

因此,如果您在堆栈上分配此结构,那就是它的全部内容:

struct my_array foo = { 0 };

要将元素放入灵活数组中,您需要动态分配内存。

struct my_array *foo = malloc(sizeof(*foo) + 1000 * sizeof(foo->item[0]));
另一答案

如果您希望数组具有分配给它的任何空间,则需要动态分配具有灵活数组成员的struct类型:

struct arr *foo = malloc( sizeof *foo + (sizeof foo->item[0] * 1000) );
if ( foo )
{
  foo->len = 1000;
  for ( int i = 0; i < foo->len; i++ )
    foo->item[i] = some_value();
}
...
free( foo );
另一答案

假设您希望item flexible-array成员包含m指针,

struct arr *p = malloc(sizeof (struct arr) + sizeof ((void*)[m])); 

这将表现为您将结构定义为

struct arr {
  int len;
  void *item[m];
};

声明它不完整,它允许您在运行时选择数组的大小。

6.7.2.1 Structure and union specifiers,第16页:

作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这被称为灵活的阵列成员。 .......如果这个数组没有元素,它的行为就像ifit有一个元素但是如果任何尝试访问该元素或者生成一个超过它的指针,则行为是未定义的。

以上是关于如何在C中使用动态大小的数组创建结构的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中找到动态分配数组的大小?

如何使用动态大小的结构数组?

在android中动态创建选项卡并使用传入的参数加载片段

数据结构中的数据——动态数组的创建

如何在具有动态大小数组的模板类中重载 operator=

通过动态分配创建数组后,在C中通过realloc改变内存大小时出现问题