C 使用sizeof访问结构的成员

C 使用sizeof访问结构的成员,c,data-structures,sizeof,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.seri

我有这样的代码,我不明白为什么它不能编译:

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]:应为“;”

当我换衣服的时候

工厂配置序列号

工厂配置


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

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

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

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

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

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

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

在C中完成这些事情的方式是

((FACTORY_CONFIG*)writeaddress)->ieee_address
就这样

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


顺便说一句,在所有大写字母中使用类型别名是违反常见编码风格和每个人的习惯的。通常,所有CAP名称都是为宏保留的。

之所以有效,是因为
sizeof
可以通过在编译时推断对象的类型来计算对象的大小。给定一个指向FOO的指针f,f->member就是一个成员,空指针(0)也可以用来避免声明临时指针。-1标准中有一个
offsetoff
宏,正是为了这个目的。这考虑了所有的填充问题,并且是可移植的。不要教人们这样的黑客行为。@JensGustedt:offsetof在这里如何帮助人们只知道结构成员的大小?@EliBendersky,他不仅仅使用
sizeof
,而是将其添加到指针中。我读到它实际上应该给出
ieee\u地址
成员的地址。请看我的答案。@JensGustedt:我的答案是对他标题和最后一句中问题的一般性回答。我没有猜测他的初衷