我们如何创建一个结构数组,该数组的最后一个字段是柔性数组?

时间:2019-02-04 21:42:39

标签: c

让我们说:

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

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

#define LEN 10

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

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

3 个答案:

答案 0 :(得分:6)

具有灵活数组成员的struct不能是数组的成员。 C standard的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);
}

答案 1 :(得分:1)

我们没有。

数组的关键特征之一是您知道一个元素与下一个元素之间的偏移量,如果元素的大小可变,则无法做到这一点。

您可以创建的是一个指向灵活大小类型的指针的数组。每个指向对象的分配方式取决于您。

答案 2 :(得分:-1)

仅使用自定义分配/数组迭代机制就可以执行代码中显示的操作(但是,您将无法使用默认的[]运算符,因为它根据大小确定偏移量成员),但我认为您不想这样做。

在C / C ++中,“灵活”数组只是指向堆中已分配内存的指针。在这种情况下,您要执行的操作是:

struct A {
  int i;
  char* c; // A pointer to an array
};

#define LEN 10
#define FLEX_ARRAY_LEN 20

struct A* my_A = malloc(sizeof(A) * LEN);
// initialize each array member
for (int i = 0; i < LEN; ++i) {
  // allocating new memory chunk for the flexible array of ith member
  my_A[i].c = malloc(sizeof(char) * FLEX_ARRAY_LEN);
}