让我们说:
struct A {
int i;
char c[1];
};
通常,我会使用malloc()
创建A的实例,例如:
#define LEN 10
struct A *my_A = malloc(sizeof(A) + LEN * sizeof(char));
但是如果我尝试创建A数组,这将不起作用
答案 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);
}