【发布时间】:2011-05-29 13:28:25
【问题描述】:
这是其中之一我认为这应该可行,但最好检查问题。它可以在我的机器上编译并正常工作。
这是否保证符合我的预期(即允许我访问数组的前几个元素,并保证结构的布局、对齐、填充等与数组相同)?
struct thingStruct
{
int a;
int b;
int c;
};
void f()
{
int thingsArray[5];
struct thingStruct *thingsStruct = (struct thingStruct *)&thingsArray[0];
thingsArray[0] = 100;
thingsArray[1] = 200;
thingsArray[2] = 300;
printf("%d", thingsStruct->a);
printf("%d", thingsStruct->b);
printf("%d", thingsStruct->c);
}
编辑:我到底为什么要做这样的事情?我有一个数组,我正在映射到一个文件。我将数组的第一部分视为“标题”,它存储有关数组的各种信息,其余部分我将其视为普通数组。如果我将结构指向数组的开头,我可以将标题数据作为结构成员访问,这样更具可读性。结构中的所有成员都与数组的类型相同。
【问题讨论】:
-
我认为只要你使用
#pragma或其他东西来禁用结构上的填充就可以了。 -
请注意,您可以使用 GCC 通过在结束结构定义的大括号后添加
__attribute__(packed)来执行此操作。 -
对于Windows编译器(GCC也支持),我相信你可以在struct定义前使用
#pragma pack(0),在struct定义后使用#pragma pack()。