我正在使用一个函数库,它具有一个结构数组。这种结构和功能具有以下布局:将一个int结构转换为一个int数组
struct TwoInt32s
{
int32_t a;
int32_t b;
};
void write(struct TwoInt32s *buffer, int len);
我最初的测试表明,这种结构的数组有相同的内存布局的int32_t
数组,所以我可以做这样的事情:
int32_t *buffer = malloc(2 * len * sizeof(int32_t));
/* fill in the buffer */
write((struct TwoInt32s*)buffer, len);
但是我想知道这是否是普遍正确的。使用数组int32_t
可以大大简化我的代码。
编辑:我忘了的sizeof
从我读,C可以保证约结构填充几件事情:
- 成员将无法重新排序
- 填充只会成员之间加入不同的对齐或结构的末尾
- 指向结构的指针指向与其第一个成员相同的内存位置
- each membe r被以适当的方式对准,用于它的类型
- 可以有根据需要在结构无名孔来实现对准
从这我可以推断出a
和b
在它们之间没有填充。但是结构可能会有填充。我对此表示怀疑,因为它在32位和64位系统上都是字对齐的。有没有人有关于此的更多信息?
小心'len'是什么意思。这是分配的内存量(可能不是)或数组中的结构数量!使用sizeof()和malloc:malloc(2 * sizeof(TwoInt32s)); – James 2011-03-21 17:29:47
@詹姆斯 - 是的,我忘了sizeof。这是在我的实际代码中。 – 2011-03-21 17:43:47