是否可以在 C 中使用嵌套的灵活数组(灵活数组的灵活数组)?
我尝试了以下代码来测试灵活数组:
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int x;
int y;
} node;
typedef struct {
int len;
node elem[];
} cell;
int cell_size = 3;
int main(void) {
cell *set = malloc(sizeof *set + cell_size * sizeof set->elem[0]);
set->len = cell_size;
for (int j = 0; j < cell_size; j++) {
set->elem[j].x = j;
set->elem[j].y = j * 10;
}
printf("set size: %d\n", set->len);
for (int j = 0; j < cell_size; j++) {
printf("x: %d, ", set->elem[j].x);
printf("y: %d\n", set->elem[j].y);
}
return 0;
}
输出是:
set size: 3
x: 0, y: 0
x: 1, y: 10
x: 2, y: 20
这里的一切都和预期的一样好。分配的空间为set
28个字节。
但是当我尝试像这样修改此代码以将灵活数组放入其他数组时:
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int x;
int y;
} node;
typedef struct {
int len;
node elem[];
} cell;
typedef struct {
int len;
cell group[];
} obj;
int cell_size = 3;
int obj_size = 4;
int main(void) {
obj *set = malloc(
sizeof *set + obj_size * sizeof (
sizeof (cell) + cell_size * sizeof(node)
));
set->len = obj_size;
for (int i = 0; i < obj_size; i++) {
set->group[i].len = cell_size;
for (int j = 0; j < cell_size; j++) {
set->group[i].elem[j].x = j;
set->group[i].elem[j].y = j * 10 + i;
}
}
printf("set size: %d\n", set->len);
for (int i = 0; i < obj_size; i++) {
printf("group size: %d\n", set->group[i].len);
for (int j = 0; j < cell_size; j++) {
printf("x: %d, ", set->group[i].elem[j].x);
printf("y: %d\n", set->group[i].elem[j].y);
}
}
return 0;
}
分配的空间为set
20字节,输出错误:
set size: 4
group size: 3
x: 3, y: 3
x: 3, y: 0
x: 3, y: 1
group size: 3
x: 3, y: 3
x: 0, y: 3
x: 1, y: 13
group size: 3
x: 3, y: 0
x: 3, y: 1
x: 13, y: 2
group size: 3
x: 0, y: 3
x: 1, y: 13
x: 2, y: 23
即使我malloc
手动设置为任何合理的值,输出仍然不正确。我认为这是因为编译器不知道group[]
顶层结构(obj
)中成员的大小。但是我没有收到任何编译器错误或警告(GCC 6.3.0)。
而且我不知道如何设置此大小并使编译器正确处理此代码。