我想创建一个具有动态数组的结构数组:
typedef struct{
float a;
int b[];
}structure_t;
n = ...;
size_t dimstruct = sizeof(structure_t)+n*sizeof(int);
structure_t * resultat = malloc(dimstruct);
如何创建此结构的动态数组并在内存中连续?
THX!
答案 0 :(得分:0)
你有正确的想法。您编写的代码使用C99样式的灵活成员为具有可变大小数组的一个结构分配空间。同样的技巧适用于C90-style zero-length array或1-sized array。
struct通常包含一个成员来指定可变长度部分的大小,尽管这显然不是必需的。但你可以看到这是如何制作这些结构的数组的。
一般
structure_t my_array[5];
...
my_array[2].a = 0.0;
与
相同(structure_t*)((void*)my_array + 2*sizeof(structure_t))->a = 0.0;
但是sizeof
我们的动态结构是什么?无论它发生什么评估,它显然是我们想要的,因为它不包括可变部分。
所以我们可以通过
来分配这些结构的数组void *result = malloc(arraysize * dimstruct);
它将是连续的。但是我们不能使用数组索引语法,因为结构的大小是未定义的。相反,我们手动编制索引,如上所示:
structure_t *p = result + i * dimstruct;
p->a = 0.0;
请注意,result
是void *
。如果我们将其声明为structure_t *
,则偏移计算会出错,因为它会使用sizeof(structure_t)
的倍数