gpt4 book ai didi

c - C中的 union 内存共享

转载 作者:太空狗 更新时间:2023-10-29 15:22:51 25 4
gpt4 key购买 nike

Edit2:我可以用 Union 做多态吗?在我看来,我可以根据需要更改数据结构。

编辑:修复代码。利用 ”。”而不是“->”。我想问的是,当有不同的数据类型(比如int和char可以互换使用)时,如何确保值被正确存储?由于两者的内存大小不同,需要更大内存空间的是为两者分配内存空间要共享的变量类型。

假设我有 2 个结构:

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'
}

据我所知,aType 和 bType 将共享相同的内存。由于 int 多了 3 个字节(int 是 4 个字节,char 是 1 个字节),它将有 4 个内存块。第一个在最左边,最后一个在最右边。当我将'a'分配给v1的变量b时,它将停留在内存块的第一个 block (最左边)。值 5 仍然保留在第四个内存块中(最右边)。

所以,打印出来的时候,会产生垃圾值,不是吗?如果是这样,如何解决这个问题?通过这个问题,这意味着如果我将 'a' 存储到 b_type,共享内存必须确保只有那个值 'a',而不是之前的整数值 5。

最佳答案

没有正确的行为。通过一个成员设置 union 并从另一个成员检索值会导致未定义的行为。您可以使用此技术做一些有用的事情,但它非常依赖于硬件和编译器。您需要考虑处理器字节顺序和内存对齐要求。

当我几乎所有的编程都是用 C 语言完成的时候,有两种(可移植的)技术使用了我非常依赖的 union 。

标记的 union 。当您需要一个动态类型的变量时,这非常有用。您设置了一个包含两个字段的结构:一个类型判别式和一个所有可能类型的 union 。

struct variant {
enum { INT, CHAR, FLOAT } type;
union value {
int i;
char c;
float f;
};
};

只要更改 union 的值并仅检索类型指定的值,就必须非常小心地正确设置类型值。

通用指针。由于您可以非常确定所有指针都具有相同的大小和表示形式,因此您可以创建指针类型的 union ,并且知道您可以互换地设置和检索值而无需考虑类型:

typedef union {
void *v;
int* i;
char* c;
float* f;
} ptr;

这对于(反)序列化二进制数据特别有用:

// 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++;

仅供引用:您可以使示例更简单。这些结构是不必要的。你会得到同样的行为:

int main() {

union {
int a;
char b;
} v1;

v1.a = 5;
v1.b = 'a';
}

关于c - C中的 union 内存共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4670448/

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