pointers - 如果 D 包含类型 B 的对象作为其第一个成员,则在 B* 和 D* 之间进行转换是否安全?

标签 pointers casting alias d

考虑以下因素:

struct B { int x; }
struct D { B b; int y; }

void main() {
    auto b = cast(B*) new D();
    writeln(b.x == b.x);
    auto d = cast(D*) b;
    writeln(b.x == d.b.x);
}

这个程序能保证写两次“true”吗?我在 D 语言引用中找不到这些规则。

最佳答案

D 中的结构“像 C 中一样工作”,因此您可以对其内部布局有合理的期望。警惕hidden members of nested structs不过。

D 转换到 B 应该没问题。向另一个方向进行转换并不安全,因为 y 将引用原始 B 变量之后的内容。

D* 转换为 B* 的一种更简单、安全的方法是获取 D.b 的地址 (B* b = &d.b).

关于pointers - 如果 D 包含类型 B 的对象作为其第一个成员,则在 B* 和 D* 之间进行转换是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28362315/

相关文章:

c - 返回指向 C 中嵌套函数的函数指针

c - 为什么以下代码打印 1 作为输出?

C:结构是作为指针实现的吗?

c++ - const int 隐式转换 C++

ruby - 在 Rails 中为路由设置别名

对 C 限制限定符感到困惑

转换、结构和公共(public)初始序列

php - 类型转换为 boolean 值

delphi - 泛型和 As Cast 的问题

alias - 带有选项的别名的 kubectl bash 补全