我最近发现了这个页面:
我对这段话感到好奇:
标准C对其精确设计的别名规则有一个特定的例外,以支持Python的情况:也可以通过指向第一个字段的指针访问结构类型的值.例如,如果结构以int开头,则struct*也可以转换为int*,允许将int值写入第一个字段.
所以我写了这段代码来检查我的编译器:
struct with_int {
int a;
char b;
};
int main(void)
{
struct with_int *i = malloc(sizeof(struct with_int));
i->a = 5;
((int *)&i)->a = 8;
}
Run Code Online (Sandbox Code Playgroud)
但我得到了error: request for member 'a' in something not a struct or union
.
我上面的段落是对的吗?如果不是,我做错了什么?另外,如果有人知道C标准在哪里引用此规则,请在此处指出.谢谢.
你的解释1是正确的,但代码不是.
指针i
已指向对象,因此指向第一个元素,因此您只需将其强制转换为正确的类型:
int* n = ( int* )i;
Run Code Online (Sandbox Code Playgroud)
然后你只需取消引用它:
*n = 345;
Run Code Online (Sandbox Code Playgroud)
或者一步到位:
*( int* )i = 345;
Run Code Online (Sandbox Code Playgroud)
1(引自来自:ISO:IEC 9899:201X 6.7.2.1结构和联合说明符15)
在结构对象中,非位字段成员和位字段所在的单元具有按顺序增加的地址他们被宣布.指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然.结构对象中可能存在未命名的填充,但不是在其开头.