c语言 内存对齐 结构体大小问题

结构体内存对齐

提前总结:结构体的大小一定是结构体中最大成员的大小的倍数,即结构体的大小主要由最大的成员决定。
比如一个结构体中成员的大小分别是 1、2、4、2、1,最大的是4,那么每个内存块的大小就是4,1和2放在第一个块里面,不足的为空,第二个内存块为4,第三个内存块为2和1,共三个块,大小为12。

规则:一个结构体有三个成员,分别是char、int、short类型,三个成员位于结构体中不同位置时整个结构体的大小可能是

#include <stdio.h>
struct s1{char a; int b; short c;};
struct s2{char a; short c; int b;};
struct s3{int b; char a; short c;};
struct s4{int b; short c; char a;};
struct s5{short c; int b; char a;};
struct s6{short c; char a; int b;};
int main()
{
    printf("char  int   short 排列大小 = %ld \n", sizeof(struct s1));  // char占1个字节,int占4个字节,1个字节存储不下,扩充为4个字节,short2个字节,填充2个字节
    printf("char  short int   排列大小 = %ld \n", sizeof(struct s2));  // char 和short+1共占4个字节,int独占一个4位的字节
    printf("int   char  short 排列大小 = %ld \n", sizeof(struct s3));  // int 独占4个字节,char 和short+1共占一个4位字节
    printf("int   short char  排列大小 = %ld \n", sizeof(struct s4));
    printf("short int   char  排列大小 = %ld \n", sizeof(struct s5));
    printf("short char  int   排列大小 = %ld \n", sizeof(struct s6));
    return 0;
}

输出结果

char  int   short 排列大小 = 12 
char  short int   排列大小 = 8 
int   char  short 排列大小 = 8 
int   short char  排列大小 = 8 
short int   char  排列大小 = 12 
short char  int   排列大小 = 8 

一个结构体中含有相同的成员,排列顺序不同,就有不同的大小。
举s1的例子:假设有一块20个字节的连续内存空间
在这里插入图片描述
char 存入占一个字节,int存入占4个字节,然后因为内存对齐的原因,char后面需要补充3个空,占4个字节位,short后面补充2个空。
图2

总结 :

  1. 向最大的类型看齐,每一个内存块都是最大的类型所占的内存的大小,总大小是最大类型所占内存大小的倍数。
    2.想要节省内存空间可以按照类型大小顺序初始化结构体。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值