c语言结构体和共用体的内存问题


#include 
typedef union{
    double I;
    int nk[5];
    char cC;
    }DATE;
struct date{
     char nCat;
     DATE cow;
     double dDog;}too;
DATE max;

int  main()

{
    printf("%d",sizeof(struct date)+sizeof(max));
return 0;
}

已知sizeof(struct date)=40,sizeof(max)=24,请问是怎么算的呢

以下内容部分参考ChatGPT模型:


首先,这段代码中定义了一个共用体和一个结构体。共用体DATE中包含了一个double类型的变量I,一个长度为5的整型数组nk,以及一个字符型变量cC。结构体date中只包含了一个字符型变量cha。

共用体的特点是所有成员共享同一块内存空间,因此对于共用体来说,每次给其中一个成员赋值,都会影响到其它成员的值。在本例中,如果给DATE中的nk数组赋值,那么I和cC的值都会发生变化。

结构体的特点是其成员占用不同的内存空间,不同成员之间互不干扰。在本例中,结构体date中的cha成员和DATE中的I、nk、cC成员都占用不同的内存空间。

以下是一个示例代码,演示了共用体和结构体的内存使用情况:

#include <stdio.h>

typedef union{
    double I;
    int nk[5];
    char cC;
} DATE;

struct date{
    char cha;
};

int main() {
    DATE d;
    d.I = 3.14;
    printf("d.I = %f\n", d.I); // 输出3.140000
    printf("d.nk[0] = %d\n", d.nk[0]); // 输出0,因为double类型占8个字节,而int类型只占4个字节,因此在共用体中将double类型拆分成了两个int类型。
    printf("d.cC = %c\n", d.cC); // 输出空字符

    struct date dt;
    dt.cha = 'a';
    printf("dt.cha = %c\n", dt.cha); // 输出a

    return 0;
}

如果我的建议对您有帮助、请点击采纳、祝您生活愉快

现代编译器为了优化内存访问,会在结构体里填充一些间隙,使得每个成员的起始位置都是4的倍数(或者8的倍数)
比如说char[5],下一个成员就不是正好在后面,可能是浪费3个字节
这叫做对其(aligning)
不同编译器的做法还不一样,所以说单看代码,没有办法确定,如果能确定,也就没必要sizeof运算符了,就是没法确定,才需要