首页 > 解决方案 > 我们如何创建一个结构数组,它的最后一个字段是灵活数组?

问题描述

假设我们有:

struct A {
  int i;
  char c[1];
};

通常我会malloc()用来创建 A 的实例,例如:

#define LEN 10

struct A *my_A = malloc(sizeof(A) + LEN * sizeof(char));

但是,如果我尝试创建一个 A 数组,这将不起作用

标签: c

解决方案


具有灵活数组成员的 Astruct不能是数组的成员。这在C 标准的第 6.7.2.1p3 节中明确说明:

结构或联合不应包含不完整或函数类型的成员(因此,结构不应包含自身的实例,但可能包含指向自身实例的指针),但结构的最后一个成员具有超过一个命名成员可能有不完整的数组类型; 这样的结构(以及任何可能递归地包含此类结构的成员的联合)不应是结构的成员或数组的元素。

您需要做的是使用指针而不是灵活的数组成员声明结构,并为每个实例分配空间。

例如:

struct A {
  int i;
  char *c;
};

struct A arr[100];

for (int i=0; i<100; i++) {
    arr[i].c = malloc(LEN);
}

推荐阅读