Unions 将数据从联合存储到另一个变量中

Unions 将数据从联合存储到另一个变量中,unions,Unions,我有一些我想理解的代码。在长整型bb中存储2,3,4之后,是否有可能将其取回 当我打印出bb时,我得到772。这是指针值吗 struct char_struct { unsigned char x; unsigned char y; unsigned char z; }; union longest { unsigned long int aa; struct char_struct b; }; int main() { unsigned long int

我有一些我想理解的代码。在长整型bb中存储2,3,4之后,是否有可能将其取回

当我打印出bb时,我得到772。这是指针值吗

struct char_struct
{
   unsigned char x;
   unsigned char y;
   unsigned char z;

};
union longest
{
   unsigned long int aa;
   struct char_struct b;
};

int main()
{
   unsigned long int bb = 0;
   union longest Longest;
   Longest.b.x = 2;
   Longest.b.y = 3;
   Longest.b.x = 4;
   bb = Longest.aa;
   printf("%ld",bb);
   return 0;
 }

C中的联合提供了多个成员的选择,每个成员都映射到相同的内存位置。如果设置了多个,则会损坏其他成员的内存

除此之外,
Longest.aa
未初始化,因此您正在打印一个垃圾值

听起来您需要一个struct,它提供了一个“垂直”的成员集合,可以同时设置和访问所有成员(就像您使用
char\u struct
)。结构的大小至少是其所有成员大小加上编译器添加的所有成员大小之和

下面是一个示例程序,演示了以下几点:

#include <stdio.h>

struct char_struct {
    unsigned char x;
    unsigned char y;
    unsigned char z;
};

struct longest_t {
    unsigned long int aa;
    struct char_struct b;
};

int main() {
    unsigned long int bb = 0;
    struct longest_t longest;
    longest.b.x = 2;
    longest.b.y = 3;
    longest.b.z = 4;
    longest.aa = 42;
    bb = longest.aa;
    printf("%ld\n", bb);
    printf("%d %d %d\n", longest.b.x, longest.b.y, longest.b.z);
    printf("longest_t size: %lu\n", sizeof(struct longest_t));
    printf("char_struct size: %lu\n", sizeof(struct char_struct));
    printf("ul int size: %lu\n", sizeof(unsigned long int));
    return 0;
}

您可能希望修改您的结构,我建议使用更具语义意义的变量名,尽管我知道这是一个示例程序。结构名有一些约定,但通常变量名不是大写的,比如
Longest

联合是“一个属性”而不是“所有属性”(结构)。您的意思是在此处使用结构(即,您是希望一次填充所有属性还是仅填充其中一个属性)?目前,
Longest.aa
在您将其分配给
bb
时未初始化。是的,所有这些都是。谢谢,它曾在某人的程序中使用过。我还是不明白为什么它是这样编码的。