我正在重写一些具有结构体数组的旧代码,每个结构体都有一个数组成员,其长度在编译时是固定的。外部数组中的结构数在编译时确定,以适合(典型)内存页。我想在运行时使inner数组变量,但是保持“ outer array适合页面”逻辑(并使用sysconf(_SC_PAGESIZE)
精确获取页面大小)。所以我的结构有一个灵活的数组成员
struct foo_t
{
bar_t *bar;
float baz[];
};
我想要一系列这些东西,但是当然不允许。但是所有这些结构都将具有相同大小的灵活数组成员(由运行时确定),所以我可以代替它们吗?也就是说,有一个char *
的空间足以容纳其中的n,自己进行偏移量计算,然后将指针偏移量转换为foo_t *
,然后访问,修改,etc。
我的目标是按下C99,C11。
为什么不这样:
#define SPP 3 // foo_t structs per memory page
const size_t baz_len = 3; // example, determine this the way you do
struct foo_t (*array) = malloc(SPP * sizeof(struct foo_t) + (SPP * baz_len) * sizeof(float));
array[2].baz[2] = 0.33f;
free(array);