gpt4 book ai didi

c - 结构名称是否指向第一个元素?

转载 作者:行者123 更新时间:2023-12-04 10:27:05 24 4
gpt4 key购买 nike

我发现了一些类似的问题,但没有一个有多大帮助。结构名称是否指向结构的第一个元素,类似于数组?

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

其他问题的所有答案都说“不”,但这个输出让我感到困惑。所有帮助将不胜感激。

最佳答案

struct 的地址确实是第一个元素的地址,尽管您需要知道元素的类型才能安全地转换它。

(C17 §6.7.2.1.15: "A pointer to a structure object, suitably converted, points to its initial member ... and vice versa. There may be unnamed padding within as structure object, but not at its beginning.")

虽然它有点丑陋,但许多生产软件都依赖于它。例如,QNX 在编写资源管理器时在开放控制 block (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 .

关于c - 结构名称是否指向第一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32597425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com