怎样计算结构体大小问题(结构体内存对齐)

本文深入探讨了结构体在内存中的排列方式,并非简单地占用连续的内存空间。通过具体实例,讲解了结构体成员如何根据对齐规则占用内存,揭示了结构体总大小的计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】

结构体在内存中是如何排列的?是像数组一样占用连续的内存空间吗?我们通过具体的例子来看一下。

【示例代码】

#include <stdio.h>
#include <stdlib.h>
 struct Test {
  char a;
  int b;
  char c;
};
int main() {
  struct Test t;
  printf("&t=%p\n", &t);
  printf("&t.a=%p\n", &t.a);
  printf("&t.b=%p\n", &t.b);
  printf("&t.c=%p\n", &t.c);
  printf("sizeof(t)=%d\n", sizeof(t));
  system("pause");
  return 0;
}

【运行结果】
在这里插入图片描述
因为最终的结果并不是6,所以我们可知结构体并不是按照像数组那样占用连续的内存空间,简单的成员相加。而是每个成员都占用了四个字节,a和c各浪费了3个字节。

接下来我们看看结构体的对齐规则

1、第一个成员在与结构体变量偏移量为0的地址处。例:&t=&t.a

2、其它成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

对齐数=编译器默认的一个对齐数与该成员大小的较小值。VS中默认值为8,Linux中默认值为4。

3、结构体总大小为最大对齐数(每个成员都有一个对齐数)的整数倍。

4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

看一个具体的题目:

 struct Test {
  char a;
  short b;
  int c;
  double d;
  int e;
  char f;
};

最终的结构体大小是多少?

在这里插入图片描述
最终结果是24.

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值