铸造结构指针指向C 的工会指针
casting structure pointer to union pointer in C++
我有一个包含各种结构成员的联合。
union U {
struct S1 as_s1;
struct S2 as_s2;
…
};
我如何将指针施放为struct as_s1的指针到C 中的Union u的指针?
我知道,因此可以使用C铸造轻松完成。但是我想使用C 的Advance Class类型铸造的功能,而不会引起任何错误。
来自标准6.9.2.4。
两个对象A和B是指针交换如果:
- 它们是同一对象,或
- 一个是标准的联合对象,另一个是该对象的非静态数据成员(12.3(,
- 一个是标准的类别对象,另一个是该对象的第一个非静态数据成员,或者如果对象没有非静态数据成员,则该对象的第一个基类子对象(12.2(,或
- 存在一个对象C,使A和C是可相互交流的,C和B是可交换的。
如果两个对象是指指针交换的,则它们具有相同的地址,并且可以通过reinterpret_cast(8.2.10(从另一个指针获得一个指针。
这意味着您可以使用reinterpret_cast
将它们相互转换。但是,您无法访问错误类型的内存。例如,以下是一个定义明确的代码:
#include <iostream>
struct S1 {
int i;
};
struct S2 {
short int i;
};
union U {
struct S1 as_s1;
struct S2 as_s2;
};
void printUnion(U* u, int type) {
if (type == 0){
S1 *s1 = reinterpret_cast<S1*>(u);
std::cout << s1->i << std::endl;
} else {
S2 *s2 = reinterpret_cast<S2*>(u);
std::cout << s2->i << std::endl;
}
}
int main() {
S1 s1{1};
printData(reinterpret_cast<U*>(&s1), 0);
S2 s2{2};
printData(reinterpret_cast<U*>(&s2), 1);
}
但是,如果您给printData
功能的错误类型参数,则该行为是不确定的。
在C 中,很难想象一个具有良好设计的程序,需要演员表。在C中,如果您已经需要联合对象,则可能会使用这种情况来实现多态性(当然没有Reinterpret_cast(。虽然通常是用void*
完成的。
此类指针铸造的适当铸件是retinterpret_cast:
#include <stdio.h>
struct S1 {
int x,y;
};
struct S2 {
double a,b;
};
union U {
struct S1 as_s1;
struct S2 as_s2;
};
int main() {
struct S1 mys1;
union U *uptr = reinterpret_cast<union U*>(&mys1);
uptr->as_s1.x = 42;
printf("%dn",mys1.x);
return 0;
}
请注意,自sizeof(struct S1) < sizeof(struct S2)
以来,在此示例中,您只为S1
的大小分配了足够的内存,如果您尝试在uptr->as_s1.b
上执行任何操作,您会损坏堆栈。
相关文章:
- 如何在 C# 中映射双 C 结构指针?
- 指针或结构的矢量
- MSVC将仅移动结构参数解释为指针
- 如何访问指针结构的成员变量?
- 如何将变量从变量传递到指针结构对象
- 如何在函数中检索指针结构
- C :变量的点地址至指针结构成员的地址
- C++指针结构不会被删除
- 初始化指针结构 - 内存中的外观
- C++指针结构和多线程
- c++中指针结构的运算符重载
- 为什么我不能转发声明指针结构?
- C# 如何定义新的指针结构
- 如何处理大型指针结构
- 我怎么能写一个函数的定义在模板类中声明返回指针结构对象
- 我如何编程指针结构或类变量在c++
- 具有指针结构的类所需的析构函数
- 为什么在非指针结构上进行类型转换会出现语法错误
- 语法:做binary_search (STL)排序向量的指针结构
- /a.检测到Glibc.out: munmap_chunk():无效指针- c++结构体的动态数组