摆脱IAR编译警告Pa039? “使用未对准结构构件的地址”

时间:2018-08-22 14:53:06

标签: c pointers compiler-errors iar

用于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));

我能否在不使用编译指示禁用警告的情况下免费获得此警告?

3 个答案:

答案 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));