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

时间:2019-06-12 00:11:53

标签: unions

我有一些要理解的代码。将其存储在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;
 }

1 个答案:

答案 0 :(得分:1)

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

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

听起来像您想要一个结构,该结构提供了一个“垂直”成员集合,可以同时设置和访问所有成员(就像使用char_struct一样)。结构的大小至少是其所有成员大小加上编译器添加的任何cache size alignment的总和。

这是一个示例程序,说明了以下几点:

#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;
}

我的机器上的运行显示:

42
2 3 4
longest_t size: 16
char_struct size: 3
ul int size: 8

您可能希望typedef您的结构,尽管我确实意识到这是一个示例程序,但我建议使用更具语义意义的变量名。结构名称有一些约定,但通常变量名称不是像Longest这样的大写字母。