关于C语言中的结构体所占的字节数 sizeof(struct)

C语言中的结构体所占的字节数 ,用sizeof求一个结构体的大小

C语言中用sizeof求结构体所占字节数的详细方法。

一、非嵌套结构体

    struct one{
        char a; // 1(char所占字节数) + 0(偏移量)
        short b; // 2(short所占字节数) + 2(偏移量)
        int c; // 4(int所占字节数) + 4(偏移量)
    };
    struct two{

        char a; // 1 + 0
        int c; // 4 + 4
        short b;// 2 + 8
    };
    struct three {
        unsigned int a; // 4 + 0
        int *p; //  8 + 8
        char b; // 1 + 16    注意 偏移量16是1的倍数,所以不用改。
    };
    printf("%d ,", sizeof (struct one));
    printf("%d ,", sizeof (struct two));
    printf("%d ", sizeof (struct three));

运行结果是:8 ,12 ,24
Parse:
one结构体的char偏移量是0,第二个short b的偏移量等于它上一个变量的所占字节数加上偏移量即1(1 + 0),但是这个偏移量要是第二个变量b所占字节数的整形倍数,所以第一个偏移量由1变成2,然后第三个变量的偏移量等于第二个变量的所占字节数加上偏移量也就是4(2(short大小) + 2偏移量大小),所以最终的大小为最后一个变量的字节数加上第二个偏移量4,4+4=8,所以结构体one的所占字节数是8。
再来看two,偏移量刚开始是0,第二个变量的偏移量等于第一个变量的偏移量加上类型所占的字节数,也就是1,但是第二个变量是int,占4个字节,偏移量要是4的整数倍,所以由 1 -> 4 偏移量最终是4,第三个是short b,占两个字节,偏移量是 int(4) + 偏移量(4) 就是8,8是2的整数倍,不需要改变,所以就是 2 + 8,10个字节,最终的这个字节数要能够被这个结构体里面的字节数最大的类型整除,two这个结构体最大的是 int 4个字节。所以最终的结果由10变成12。
第三个思路也是一样,结果由17个字节转变成最终的24个字节。
规则是:

	1. ***第一个变量的偏移量是0。***
	2. ***第二个变量的偏移量等于前面一个变量的类型所占字节数加上偏移量。***
	3. ***最终的字节数能够被这里面所占字节数最大的类型整除。***

二、嵌套结构体

    typedef struct{
        char a;
        struct
        {
            int *p;
        } kk;
        char c;
    }node1;
    typedef struct{
        char a;
        
        struct
        {
            int age;
            int *p;
        } kk;
        
        int b;
    }node2;

    printf("%d ,", sizeof (node1));
    printf("%d ,", sizeof (node2));

结果为:24 ,40 ,
首先来看第一个node1,结构体里面又嵌套了一个结构体,在这之前我看了网上的很多博客,看的是云里雾里的,简称”不说人话“。经过长达几个小时的折腾,最终找到了一些规律,用很多例子测试发现也是正确的。先由内到外一层一层的找,先找出内嵌结构体占字节数最大的类型,这个里面只有一个int p,占8个字节。然后在来看外面的,将外层的结构体分为两层,内嵌结构体上面的和下面的,将所有类型的字节数之和相加在除以这一整个结构体最大的类型(这里指的是前面提到的 int八个字节)在向上取整乘以最大的字节数,1除以8是零点几,向上取整后是1,在乘8 也就是8。然后是下半部分,只有一个int b,4个字节,4 / 8取整乘8也是8。外层两部分相加之后是16,内层这个结构按照前面的无嵌套结构体算就行了,就是8个字节。最后就是外层加内层 16 + 8 = 24个字节(这个结果也要满足是最大类型所占字节的倍数)。
第二个方式和上面一样。外层是 8 + 8 = 16个字节,内层是20个字节,外层加内层就是36个字节,这个结果不是最大字节数8的倍数,所以最终的结果是40。

END

本文仅为个人观点,如有疑问请在评论区指正!

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年5月6日
下一篇 2022年5月6日

相关推荐