struct name是否指向第一个元素?

Hel*_*llo 2 c struct pointers

我发现了一些类似的问题,但没有一个问题有多大帮助.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);
Run Code Online (Sandbox Code Playgroud)

输出:

5
5
10
2033501712
2033501712
2033501716
Run Code Online (Sandbox Code Playgroud)

其他问题的所有答案都说"不",但这个输出让我感到困惑.非常感谢所有的帮助.

Clo*_*oud 6

a的地址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);
Run Code Online (Sandbox Code Playgroud)

最后,这只适用于第一个元素.后续元素可能不是您期望它们的情况,即由于struct打包和填充.