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

时间:2019-03-19 16:29:24

标签: c arrays struct

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

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];

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

3 个答案:

答案 0 :(得分:3)

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

因此,如果您在堆栈上分配此结构,则仅此而已:

struct my_array foo = { 0 };

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

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

答案 1 :(得分:2)

如果要为数组分配任何空间,则需要动态分配带有 flexible数组成员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 );

答案 2 :(得分:0)

假设您希望screen-readers灵活数组成员包含item指针,

m

这与您将结构定义为

时的行为相同
struct arr *p = malloc(sizeof (struct arr) + sizeof ((void*)[m])); 

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

struct arr { int len; void *item[m]; }; 中,第16页:

  

在特殊情况下,结构中具有多个命名成员的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。 .......如果此数组不包含任何元素,则其行为就好像它具有一个元素,但是如果尝试访问该元素或生成一个指向该元素的指针,则该行为未定义。