首先,在C语言中强制转换指向结构体的指针以访问其中的第一个成员是合法的,这在C语言标准6.7.2.1/13中有所说明。该规定指出,在结构体对象内部,非位域成员和位于位域内的单元的地址按照声明顺序递增。指向结构体对象的指针经过适当转换后指向其初始成员(如果该成员是位域,则指向它所在的单元),反之亦然。结构体对象内部可能存在未命名的填充空间,但不会出现在起始位置。其次,C语言中的别名规则(aliasing rule)如下(§6.5/7):只有以下类型的lvalue表达式才能访问一个对象的存储值:- 与对象的有效类型相容的类型; - 对象的有效类型的限定版本的相容类型; - 与对象的有效类型相应的带符号或无符号类型; - 对象的有效类型的限定版本的相应带符号或无符号类型; - 包含上述任一类型之一的聚合体或联合体类型(包括子聚合体或包含联合体的成员的递归类型); - 字符类型。在本例中,您将通过“与对象的有效类型相容的类型”和“包含上述任一类型之一的聚合体或联合体类型”类型的指针访问该对象,因此别名也没有问题。因此,在C语言中,通过将指向结构体的指针转换为所需成员的类型来访问结构体的第一个成员是完全合法的。但在C++中,通常会在C++对象的开头找到虚表(vtable)等内容。但在您的特定情况下,您的结构体具有标准布局,因此这是明确允许的(参见n3290中的§9.2/20,感谢Luc Danton!- C++03显然有类似于POD对象的规定)。
c++
。;-] - ildjarn