我发现了一些类似的问题,但没有一个帮助太多。 struct name是指向struct的第一个元素的指针,类似于数组吗?
struct example {
int foo;
int bar;
};
struct example e;
e.foo = 5;
e.bar = 10;
printf("%d\n%d\n%d\n%d\n%d\n%d\n", e, e.foo, e.bar, &e, &e.foo, &e.bar);
输出:
5
5
10
2033501712
2033501712
2033501716
其他问题的所有答案都说" no",但这个输出让我感到困惑。非常感谢所有的帮助。
答案 0 :(得分:6)
struct
的地址确实是第一个元素的地址,但你需要知道元素的类型才能安全地投射它。
(C17§6.7.2.1.15:“适当地指向结构对象的指针 转换后,指向其初始成员......反之亦然。也许有 在结构对象中是未命名的填充,但不在其中 开始“。)
虽然它很丑陋,但许多生产软件依赖于此。例如,QNX在编写资源管理器时在开放控制块(OCB)逻辑中使用这种行为。 Gtk也类似。
您当前的实施虽然很危险。如果您必须依赖此行为,请执行此操作,并且不要尝试将指针结构作为参数传递给printf()
,因为您故意破坏具有最小类型的语言的功能 - 安全。
struct example {
int foo;
int bar;
};
struct example myStruct = { 1, 2 };
int* pFoo = (int*)&myStruct;
printf("%d", *pFoo);
最后,这只适用于第一个元素。后续元素可能不是您期望的情况,namely due to struct
packing and padding。
答案 1 :(得分:4)
struct
名称不是任何指针。您通过使用不兼容的格式说明符struct
将printf
传递给%d
来调用未定义的行为。它似乎“有效”,因为结构的第一个成员与struct
本身具有相同的地址。