C语言基础:C语言结构体(2)

上一节, 我们简单的介绍了结构体的一些知识点, 以及一些注意的事项, 这次我们来看看结构体是怎么样在内存存储的~


我们来看一个小例子:

#include <stdio.h>

int main()
{
    struct Date
    {
        int year;
        double dou;
        int month;
        int day;
    };
    
    struct Date D = {2014, 1.2, 9, 10};
    
    int c = sizeof(D);
    
    printf("size = %d
", c);

    return 0;
}

输出的结果;



按照我们对类型来算, 3个int类型是12, 再加上一个double类型, 应该是20才对, 那为什么会24呢?


其实啊, 在结构体里, 是按照最长的类型倍数来存储的, 而这4个类型里面最长的就是double, 所以是输出24, 看看下面的示意图吧;



在结构体上, 这样子叫做对齐算法, 也可以成为补齐算法, 以最大的那个类型的倍数来存储, 不够存就添加都一个最长的, 哪怕是多余, 也不会理会~~


下面还有一个例子:

#include <stdio.h>

int main()
{
    struct Date
    {
        int year;
        int month;
        int day;
    };

    // 2.定义结构体变量(真正分配存储空间)
    struct Date d1 = {2011, 4, 10};

    struct Date d2 = {2012, 8, 9};

    // 会将d1所有成员的值对应地赋值给d2的所有成员
    d2 = d1;

    printf("d1 = %d - %d - %d
", d1.year, d1.month, d1.day);
    printf("d1的地址为:%p
", &d1);

    printf("d2 = %d - %d - %d
", d2.year, d2.month, d2.day);
    printf("d2的地址为:%p
", &d2);

    return 0;
}

输出的结果:



虽然代码里d1把值都赋给了d2, 但是它们也是互不相关的, 它们两个是独立的两个整体, 在后面随意怎么修改它们任意一个的值, 另一个也不会因为这样子而改变里面的值.


好了, 这次我们就讲到这里, 下次我们继续~~~

原文地址:https://www.cnblogs.com/iOSCain/p/4282885.html