Union 的大小以及为什么它返回 24

问题描述

问题来了:

我需要知道 union 有多大(或者类似的东西,我是 C 的新手,如果我想知道如何学习更多的 C,我会很棒)

Union 应该给我回 20 吗?

它给了我 24,我需要一个解释。

#include <stdio.h>
#include <stdlib.h>
union Zadanie {
    int calkowita;
    char znak[20];
    double rzeczywista;
}ZadanieU;
typedef struct {
    int calkowita;
    char znak[20];
    double rzeczywista;
}ZadanieS;
int main()
{
    ZadanieS z1  = {2,"Borys",3.5};
    printf("%d,\n %s,\n%0.1f \n\n",z1.calkowita,z1.znak,z1.rzeczywista);

    printf("Rozmiar unii: %d\n",sizeof(ZadanieU));
    printf("Rozmiar Struktury: %d\n\n",sizeof(ZadanieS));

    printf("Rozmiar unii Calkowitej:%d \n",sizeof(ZadanieU.calkowita));
    printf("Rozmiar Struktury Calkowitej: %d\n\n",sizeof(z1.calkowita));

    printf("Rozmiar unii Char:%d \n",sizeof(ZadanieU.znak));
    printf("Rozmiar Struktury Char: %d\n\n",sizeof(z1.znak));

    printf("Rozmiar unii Rzeczywistej:%d \n",sizeof(ZadanieU.rzeczywista));
    printf("Rozmiar Struktury Rzeczywistej: %d\n\n",sizeof(z1.rzeczywista));
    return 0;
}

解决方法

sizeof(ZadanieU) 将告诉您该类型数组中该联合的两个连续实例的地址之间的差异。

在某些架构上,double 值在 8 字节边界上对齐,并且联合包含一个双精度值,因此它也会在 8 字节边界上对齐。

因此,连续联合地址之间的差值为 24。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...