内存中连续的结构数组

时间:2012-03-26 15:11:15

标签: arrays dynamic struct mpi

我想创建一个具有动态数组的结构数组:

typedef struct{
    float a;
    int b[];
}structure_t;

  n = ...;
  size_t dimstruct = sizeof(structure_t)+n*sizeof(int);
  structure_t * resultat = malloc(dimstruct);

如何创建此结构的动态数组并在内存中连续?

THX!

1 个答案:

答案 0 :(得分:0)

你有正确的想法。您编写的代码使用C99样式的灵活成员为具有可变大小数组的一个结构分配空间。同样的技巧适用于C90-style zero-length array1-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;

请注意,resultvoid *。如果我们将其声明为structure_t *,则偏移计算会出错,因为它会使用sizeof(structure_t)的倍数