用于ARM的IAR编译器...
我有一个使用打包的结构
#pragma pack(push, 4)
typedef struct {
int a;
double b;
} my_t;
#pragma pack(pop)
我想获取一个字段的地址,然后转换为char *
。
my_t d;
char * p = (char *)(&(d.b));
我能否在不使用编译指示禁用警告的情况下免费获得此警告?
答案 0 :(得分:2)
我个人将使用下面的示例中的编译指示来关闭此部分代码的警告。
char *g(void)
{
#pragma diag_suppress=Pa039
return (char *)(&d.b);
#pragma diag_default=Pa039
}
如果这不是一个选项,则可以在b
中找到my_t
的偏移量并将其添加到d
的地址中
char *f(void)
{
return (char *)&d + offsetof(my_t, b);
}
答案 1 :(得分:0)
因为double
通常比int
大,并且由于该结构是压缩的,所以当较小的字段首先出现时,字段b
不能正确对齐。
先放置较大的字段,并且两者都应正确对齐:
typedef struct {
double b;
int a;
} my_t;
答案 2 :(得分:0)
首先:您应该确保将double变量在数据类型内部对齐4个字节,您的代码是正确的!
#pragma pack(push, 4)
typedef struct {
int a;
double b;
} my_t;
#pragma pack(pop)
其次:您的变量地址应与之对应
#pragma data_alignment = 4
my_t d;
char * p = (char *)(&(d.b));