【发布时间】:2020-08-21 07:48:12
【问题描述】:
假设定义了 2 个结构,例如:
typedef struct {
T x;
T y;
} A;
typedef struct {
A a;
T z;
} B;
我可以将指向结构 B 的指针视为指向结构 A 的指针吗?
在实践中这是可靠的/标准的/可移植的/编译器不变的:
B b = {{1,2},3};
A * a = &b;
print(a->x);
print(a->y);
【问题讨论】:
-
嗯,您应该能够可靠地将
*B转换为*A,因为如 C99 标准第 6.7.2.1 §13 节所述:“指向结构对象的指针,适当地转换后,指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。”。但是,我认为A *a = &(b->a)更干净。 -
总是尝试编写明显正确的干净代码。只有当您拼命尝试优化最后纳秒的性能时,您才能考虑应用技巧,例如将一种类型的结构解释为另一种类型的结构
-
@4386427 当以骗子身份关闭时,不一定要让最旧的一个打开。链接中接受的答案真的比我发布的更好吗?它没有引用任何内容,它只是一个“相信我”的答案,没有任何例子。我们应该努力保持质量,而不是保留“西部最快的枪”。我显然是偏心的,因为我发布了一个答案,所以我不会重新打开。
-
@Lundin 好吧,在我作为 dup 关闭时,我没有看到两个 Q/A 之间有任何显着的质量差异。双方都表示这是合法的。两者都引用了标准的第 6.7.2.1 节。区别 - 正如我所看到的 - 是 1)在这个 Q/A 中,引用在 A 中,而它在 dup 中的 Q 中,2)这个 Q/A 包含的标准文本比重复。如前所述 - 我不认为这是一个显着的差异。无论如何 - 我不介意有人把它转过来,这样另一个现在关闭了,而这个打开了。
-
@4386427 一切都好,只要考虑内容而不是发布日期。
标签: c pointers struct compilation