我有records
灵活的数组成员
typedef struct record {
unsigned foo;
signed bar;
double number[];
} record;
我有多个records
具有相同数量的numbers
,因此我可以将它们排列在数组中。我想将它们分配到一个连续的内存空间。
const unsigned numbers = ...;
const unsigned records = ...;
const size_t record_size = sizeof(record) + numbers*sizeof(double);
record *prec = malloc(records*record_size);
所以现在我知道record_size
并且我可以访问它但是最佳做法是如何通过给定record
索引正确安全地执行此操作?
当我将包含foo
和bar
以及numbers
的标题分开时,我可以这样做,但我想将record
保持在一起以保持缓存一致性。
答案 0 :(得分:1)
由于只有你知道实际的布局,C编译器无法帮助你。因此,您必须自己进行地址计算。它需要一些强制转换才能在字节级执行指针运算:
record * get_record(record *base, size_t numbers, size_t index)
{
return (record *) ((unsigned char *) base +
index * (sizeof *base + numbers * sizeof *base->number));
}
鉴于以上(以及您的代码);你可以像这样访问数组:
record *first = get_record(base, numbers, 0);
first->foo = 4711;
record *second = get_record(base, numbers, 1);
second->foo = 17;
一个明显的缺点是你必须保持numbers
值。这可以通过使用显式“基础”结构对整个数组建模来改进,该结构保存每个元素和基本指针的大小。当然,它可以与元素本身共同分配,以便将它们保持在一起并减少所涉及指针的距离。