访问sizeof结构的成员

时间:2011-12-11 11:46:04

标签: c data-structures sizeof

我已经获得了这段代码,我不明白它为什么不编译:

typedef struct 
{
  uint32_t serial_number;
  uint32_t ieee_address[6];
} FACTORY_CONFIG; 

...
// Unlock flash (only the portion we write on)
    error = FLASHD_Unlock ( writeaddress, writeaddress + sizeof ( FACTORY_CONFIG.serial_number ), 0, 0 );

当我运行它时,我收到此错误:

  

错误[Pe018]:预期a")"

当我改变

  

FACTORY_CONFIG.serial_number

  

FACTORY_CONFIG

,它编译,一切正常。我不确定,我可以检查结构内部类型的大小吗?

3 个答案:

答案 0 :(得分:3)

您不能像这样访问C中的类型成员。但是,您可以从实际对象中获取sizeof。由于sizeof是一个编译时构造,因此这些对象甚至不必有效。所以以下内容将起作用:

sizeof(((FACTORY_CONFIG *)0)->serial_number)

如果你经常使用它,或者只是为了便于阅读,你可以用它制作一个宏。

答案 1 :(得分:0)

您需要先创建对象。您正在创建的结构只是一种类型。 这样做:

sizeof (((FACTORY_CONFIG *)0)->serial_number)

答案 2 :(得分:0)

您似乎想要的是,将您的writeaddress解释为指向struct的对象,然后访问ieee_address成员的地址。

这种事情要用C完成的方式是

((FACTORY_CONFIG*)writeaddress)->ieee_address

就是这样。

您使用的方法非常危险,因为您不知道编译器如何在内存中布局struct。如果必须,可以使用offsetof宏来获取字段的确切位置。

BTW,在所有大写字母中使用类型别名是针对常见的编码风格和针对每个人的习惯。通常所有大写名称都保留给宏。