关键词搜索

源码搜索 ×
×

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

发布2023-02-15浏览725次

详情内容

结构体的内存

一.提出疑问

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

先举一个实例:

  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. }

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

 

 解释思路:

  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,满足条件。

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

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

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

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载