Edit2:我可以用Union做多态吗?在我看来,我可以根据自己的需要更改数据结构.
编辑:修复代码.使用 "." 而不是" - >".我想问的是,如果有不同的数据类型(如int和char可以互换使用,如何确保正确存储值?由于两者具有不同的内存大小,需要更大内存空间的那个将为两者分配内存空间要共享的变量类型.
假设我有两个结构:
typedef struct a{
int a;
}aType;
typedef struct b{
char b;
}bType;
typedef union{
aType a_type;
bType b_type;
}ab;
int main(void){
ab v1;
v1.a_type.a = 5;
v1.b_type.b = 'a'
}
Run Code Online (Sandbox Code Playgroud)
据我所知,aType和bType都将共享相同的内存.由于int有3个字节更大(int是4个字节,char是1个字节),因此它将有4个内存块.第一个是最左边,最后一个是最右边.我将'a'分配给v1的变量b的时间,它将保留在内存块的第一个块(最左边).值5仍然保留在第四块内存中(最右侧).
因此,当打印出来时,会产生垃圾值,不是吗?如果是这样,如何解决这个问题?通过这个问题,这意味着如果我将'a'存储到b_type中,共享内存必须确保仅具有该值'a',而不是前一个整数值5.
没有正确的行为.通过一个成员设置union并从另一个成员检索值会导致未定义的行为.您可以使用此技术执行有用的操作,但它依赖于硬件和编译器.您需要考虑处理器字节顺序和内存对齐要求.
回到我几乎用C编写的所有编程时,有两种(便携式)技术使用了我非常依赖的联合.
标记的联合.当您需要动态类型变量时,这很好.您设置了一个包含两个字段的结构:类型判别式和所有可能类型的并集.
struct variant {
enum { INT, CHAR, FLOAT } type;
union value {
int i;
char c;
float f;
};
};
Run Code Online (Sandbox Code Playgroud)
只要更改了union的值并且只检索该类型指定的值,就必须非常小心地正确设置类型值.
通用指针.由于您可以非常确定所有指针具有相同的大小和表示形式,因此您可以创建指针类型的并集,并且知道您可以交替设置和检索值,而不考虑类型:
typedef union {
void *v;
int* i;
char* c;
float* f;
} ptr;
Run Code Online (Sandbox Code Playgroud)
这对于(反)序列化二进制数据特别有用:
// serialize
ptr *p;
p.v = ...; // set output buffer
*p.c++ = 'a';
*p.i++ = 12345;
*p.f++ = 3.14159;
// deserialize
ptr *p;
p.v = ...; // set input buffer
char c = *p.c++;
int i = *p.i++;
float f = *p.f++;
Run Code Online (Sandbox Code Playgroud)
仅供参考:您可以使您的示例更简单.结构是不必要的.你会得到相同的行为:
int main() {
union {
int a;
char b;
} v1;
v1.a = 5;
v1.b = 'a';
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3425 次 |
| 最近记录: |