【发布时间】:2015-10-19 15:55:54
【问题描述】:
考虑以下结构:
typedef struct {
uint32_t foo;
uint32_t bar;
} first_struct_t;
typedef struct {
first_struct_t f;
uint8_t *p;
uint8_t buf[];
} second_struct_t;
但是,稍后在我的代码中,会发生以下分配:
typedef struct {
first_struct_t *f;
// ...
} some_struct;
int function_before_foo(some_struct *p) {
p->f = (second_struct_t *) malloc(sizeof(second_struct_t));
// ...
}
int function_foo(some_struct *p) {
second_struct_t *s = (second_struct_t *) p->f;
// ...
}
由于-Wcast-align,它会产生以下错误:
'second_struct_t *' increases required alignment from 4 to 8 [-Werror,-Wcast-align]
second_struct_t *s = (second_struct_t *) p->f;
解决方案是将其转换为void *,但这似乎只是掩盖了问题。什么是最干净的解决方案?
编辑:这只会发生在 clang 而不是 GCC,不管这两个编译器都被赋予了 -Wcast-align 标志。
【问题讨论】:
-
some_struct *p和struct_second_t *s不可互换(指向结构的指针始终指向其第一个成员,但事实并非如此)。你的意思是first_struct_t *s = (first_struct_t *) p->f;? -
p->f不是first_struct_t吗?不是first_struct_t *? -
你是对的。我修正了无效的措辞。
-
stackoverflow.com/questions/10951039/… 尝试强制
first_struct_t8 字节对齐。
标签: c struct casting clang memory-alignment