首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在联合内声明结构变量的目的

在联合内声明结构变量的目的
EN

Stack Overflow用户
提问于 2019-11-21 00:52:01
回答 1查看 117关注 0票数 0

我有这样的密码

代码语言:javascript
复制
typedef struct
{
    unsigned char arr[15]; //size = 15bytes
    unsigned char str_cks; //size = 1byte
}iamstruct; //Total Size = 16bytes

typedef union 
{
    iamstruct var;
    unsigned char union_cks[16];
}iamunion;  //Total Size = 16bytes

static iamunion var[2];

int main()
{
    printf("The size of struct is %d\n",sizeof(iamstruct)); //Output = 16

    printf("The size of union is %d\n",sizeof(iamunion)); //Output = 16

    var[1].union_cks[1] = 2;

    printf("%d",var[1].union_cks[1] ); // Output =2 

    return 0;
}

我混淆了联合内部的struct变量声明以及它是如何工作的?

这样做的主要目的是什么&它如何提高可访问性?

请分享你的想法。

提前谢谢。

我现在从下面的代码中理解了一些东西。在此,分配的内存为16字节,其全部由联合的单个成员共享。

代码语言:javascript
复制
typedef struct
{
    unsigned char str_cks1;
    unsigned char str_cks2;
    unsigned char str_cks3;
    unsigned char str_cks4;
    unsigned char str_cks5;
    unsigned char str_cks6;
    unsigned char str_cks7; 

}iamstruct;

typedef union 
{
    iamstruct var;
    unsigned char union_cks[7];

}iamunion;

static iamunion var[7];

int main()
{
    int i = 0;
    printf("The size of struct is %d\n",sizeof(iamstruct));

    for(i=0;i<7;i++)
    {
        var[i].var.str_cks1 = (i*1);
        var[i].var.str_cks2 = (i*2);
        var[i].var.str_cks3 = (i*3);
        var[i].var.str_cks4 = (i*4);
        var[i].var.str_cks5 = (i*5);
        var[i].var.str_cks6 = (i*6);
        var[i].var.str_cks7 = (i*7);
    }

    for(i=0;i<7;i++)
    {
        printf("%d\t",var[i].var.str_cks1);
        printf("%d\t",var[i].var.str_cks2);
        printf("%d\t",var[i].var.str_cks3);
        printf("%d\t",var[i].var.str_cks4);
        printf("%d\t",var[i].var.str_cks5);
        printf("%d\t",var[i].var.str_cks6);
        printf("%d\t",var[i].var.str_cks7);
        printf("\n");
    }
    return 0;
}

输出:在这里输入图像描述

EN

回答 1

Stack Overflow用户

发布于 2019-11-22 07:22:47

struct表示其所有字段类型的笛卡尔乘积对应的值。这些值是字段值的有序连接,都存在于每个结构值中。从这个意义上说,您将看到字段中的所有值都是值的元组或序列,它们所代表的字段的每个类型。

相反,union代表了内部每个字段的另一种选择,因此类型的整个值集是其内部每种类型的简单联合。

因此,组合( unionstruct)可以确保您可以设置一个有序的值序列(struct),或者将struct字段看作是联合的一个选项。简单,对!:) (您也可以将union作为struct的字段,这意味着序列中的字段是可能的值集的另一种选择。

让我们用一个例子来看它。让我们假设您有一个变量,它应该存储真正的或复杂的值。对于Real,您只需使用一个普通的float值(我将故意地对其进行复杂处理,以查看它是如何扩展的),对于复杂,我们将使用两个double值(此选择与另一种选择无关,与floatdouble的精度损失无关):

代码语言:javascript
复制
struct complex {
    double real_part, imaginary_part;
};

然后

代码语言:javascript
复制
union {
    float real_number;
    struct complex complex_number;
} my_variable;

然后,您可以访问my_variable.real_number作为单精度float值,my_variable.complex_number.real_partmy_variable.complex_number.imaginary_part作为复数的双精度double实部和虚部。

请注意,这不是将值从实值转换为复杂值的方法,反之亦然。实际上,在本例中,两种类型的值在内部都有不同的表示形式,如果在变量上存储一个精确的float实数,并尝试将其访问为复数(您必须从外部管理存储在变量中的值类型,以便知道如何访问它),变量中可存储的值集将是实数的整组float值,加上(或)整组符合复数的double对或实部和假想部分。这就是提取union保留字的地方。

重要的是要考虑类型表示在该类型的变量中可存储的一组值。通过这种方式,struct允许您存储字段所代表的每种类型的值,您可以同时在变量上存储所有这些类型的值,而union只允许您决定您将使用哪种类型(以及哪个字段)来存储--只存储这些字段备选方案中的一个值,而不超过一个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58965626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档