C语言之结构体内存的计算

逃离我推掉我的手 2023-09-24 18:32 12阅读 0赞

结构体的内存

一.提出疑问

结构体占用的是一片连续的内存空间,大小是由成员变量的类型决定的。但并不是计算所有成员变量的类型大小之和那么简单。

先举一个实例:

  1. struct student {
  2. int age; //4个字节
  3. int telephone; //4个字节
  4. };
  5. int main()
  6. {
  7. struct student s;
  8. // s的字节为8;
  9. printf("%d", sizeof(s));
  10. return 0;
  11. }

如图,结构体student中含有2个int类型成员变量,代码运行后,可知结构体的大小为8个字节。

可真的是因为两个成员变量的大小之和嘛?

我们再来一个实例:

  1. struct student {
  2. int age; //4个字节
  3. char name; //1个字节
  4. int telephone; //4个字节
  5. };
  6. int main()
  7. {
  8. struct student s;
  9. // s的字节为12;
  10. printf("%d", sizeof(s));
  11. return 0;
  12. }

图中的三个成员变量分别为 int,char,int类型,三个成员变量的内存相加为9个字节

可为什么结构体内存会等于12呢?

很明显结构体内存大小 不等于 所有成员变量的内存大小之和

二.计算结构体内存大小

在计算结构体内存大小时,我们得先学会一个规则——-对齐规则。

  1. 第一个成员在与结构体变量偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
    (VS中默认的值为8)
  3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
    体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

理论已出,现在来实践计算一下:

  1. struct student {
  2. int age; //1个字节
  3. char name; //1个字节
  4. int telephone; //4个字节
  5. };
  6. int main()
  7. {
  8. struct student s;
  9. // s的字节为12;
  10. printf("%d", sizeof(s));
  11. return 0;
  12. }

例如以上代码,借助图 解释:

f0558ac1c385423780948a9443edf490.png

解释思路:

  1. 首先根据规则,第一个成员得在地址为0处,然后成员的内存大小为4个字节,所以占用4个空间,地址0~3。
  2. 第二个成员变量得开始遵循对齐规则,由于char为1个字节,所以无论地址为多少,都是1的整数倍,也占用一个空间,地址4。
  3. 最后,第三个成员为int类型,此时地址已经到达了4的位置,而现在需要对齐int类型4个字节的整数倍,则需要从8开始,直到占有4个空间,地址8~11。
  4. 结束:结构体总大小为最大对齐数(成员变量的内存)的整数倍,而该结构体的最大的内存类型为int 4个字节,而此时使用的内存0~11,则是12,满足条件。

注:若是不满足时,则需要往后扩充,直到满足为止。

创作不易,路过的帅哥美女,动动小手,点点赞咯,蟹蟹啦

若文章有问题,请指出,虚心接受批评

发表评论

表情:
评论列表 (有 0 条评论,12人围观)

还没有评论,来说两句吧...

相关阅读

    相关 结构体内对齐

    结构体内存对齐规则 > 1. 第一个成员在与结构体变量偏移量为0的地址处。 > 2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 > 对齐数 = 编

    相关 c语言结构体内对齐问题

        c语言中结构体使用是非常广泛的,但是结构体有一个问题,就是如果开头的字段属性是字符类型(char),紧跟着的是其他类型,比如整型、长整型、双精度、浮点型,这时候结构体的

    相关 关于结构体内对齐总结

    内存对齐计算可谓是笔试题的必考题,但是如何按照计算原则算出正确答案一开始也不是很容易的事,所以专门通过例子来复习下关于结构体内存对齐的计算问题。(编译环境为vs2015)