结构体声明、结构体对齐问题

今天我们来介绍一下结构体相关知识,那么废话不多说直接开始

1.结构体的关键字struct

我们如果要写一个结构体,那么struct这个关键字是不能少的

有了这个关键字,我们就可以创建一个结构体,下面让我们来声明一个结构体如图所示,我们声明了一个结构体Struct Stu,那么这个结构体里就可以存各种类型的数据

比如整型、浮点型、字符型等等,如图我们储存了一个字符型数组和一个整型

分别代表一个学生的姓名和年龄,注意最后要加一个分号,我们的结构体就算声明完成                        

2.结构体变量的声明和使用                                                                                                             

                                                                                                                 

如图,我们只需要在上面创建好结构体的名字的基础上加上你要定义的变量名,那么我们的结构体变量就创建完成了。我们根据结构体里的内容给它赋值,比如这里我就把zhangsan,18这个信息赋值进去了,那么我们怎么把信息拿出来使用呢?很简单,按我的这个举例,我们只需要在变量名后面加上    .   就可以使用,当然要打印的话还是得根据你在结构体里存放的类型,比如我们存放的zhangsan是字符串,18是整型,那么打印的时候就要用%s  %d打印   ,下面让我们看看输出结果吧人名和年龄是不是就打印出来了?这就是结构体的魅力,我们甚至可以把英文名换成中文名,也是可以打印出来的,当然结构体的命名规则也是要以易懂为主,重要的是这个名字跟里面存放的信息要贴切,不能命名是学生Stu 而里面的信息却是酒的种类吧,这不合适。讲到这,我们的结构体创建、声明和使用就算讲个大概了。

下面让我们来说一下更重要的内容,结构体的对齐问题

这个问题并不算难,大家看看应该就懂了

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

什么意思呢?我们先看一个结构体问这个结构体大小是多少?你是不是以为是7,如果你是这么想的那么就错了,为什么呢?下面让我们来说说对齐,char的大小是1 vs默认对齐数是8,那么它的对齐数就是1,同理int 的对齐数是4,short的对齐数是2,它们的最大对齐数就是4,对齐数是从0开始数的,所以我们想象很多方格,从0开始递增,0的位置放了一个数,下面到int,由于int的对齐数是4,我们存放的时候要放到4的倍数的位置,那么我们就要跳过1,2,3这3个方格,我们在4这个位置开始放,放4个方格,也就是4,5,6,7,然后我们看short的对齐数为2,那么存放short的时候就要放到2的倍数的位置,那么8正好就可以,所以我们从8开始存放2个字节,8,9总共有10个字节,但是到这还没有结束,我们需要看最终它们相加的字节是否是最大对齐数的倍数,在这里就是4的倍数,10明显不是4的倍数,但是12是,所以这个结构体的大小就是12个字节,在这里是vs默认对齐数为8算出来的结果,我们可以用#pragma pack(设置对齐数),这个指令修改默认对齐数,下面让我们看看上面运行的结果是不是12可以看到结果就是12,看到这,你应该理解结构体的对齐了吧,当然我们在结构体中换一下它们的位置,结果可能发生变化比如这里我们将int放在char前面,最后算出的结果会变成8个字节,因为从0开始存放int存放0,1,2,3这4个字节,char存放了4这一个字节,而short跳过5从6开始存放,存放6,7这2个字节,最后总共就是8个字节,正好是最大对齐数8的倍数,而这我们是在默认对齐数为8的情况下实现的,你要是想改也可以,下面我们看看运行结果吧。可以看到结果就是8,那么讲到这我就讲完了,谢谢各位的观看

  • 39
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值