我正在修改一些 C 代码,大致如下:
typedef struct STRUCT_FOO {
ULONG FooInfo;
union {
ULONG LongData;
USHORT ShortData;
UCHAR CharData;
};
} FOO;
...
FOO foo;
ULONG dataLength = offsetof(FOO, CharData) + sizeof(foo.CharData);
显然,当使用联合的 CharData 成员时,代码会尝试计算结构中感兴趣的字节数。我的问题是,编译器警告联合未命名。所以我把它改成
typedef struct STRUCT_FOO {
ULONG FooInfo;
union {
ULONG LongData;
USHORT ShortData;
UCHAR CharData;
} FooData;
} FOO;
但是当然我还需要更改最后一行。以下总是会产生与原始结果完全相同的结果吗?
ULONG dataLength = offsetof(FOO, FooData) + sizeof(foo.FooData.CharData);
还是有可能,CharData(或 ShortData 或 LongData)不会在联合的开头对齐?
-- 编辑:感谢您的回答。这个问题的答案实际上为我提供了我需要的答案:一个指向联合对象的指针,经过适当转换,指向它的每个成员(或者如果一个成员是位域,则指向它所在的单元),并且反之亦然。.
无论如何,我是否应该为这个问题选择一个答案作为接受的答案?