大厂笔试题常考类型之结构体的内存对齐

目录

结构体的声明

结构体定义和赋初值

结构体的内存对齐数

例题:


结构体的声明

struct tag{

          char name[];

          int age;

}peo;

注意:结构体中的分号一定不能省,不可忽略

结构体定义和赋初值

struct tag p={"zhangsan",23};

//初始化:定义变量的同时赋初值。
struct Point p3 = {x, y};

struct Stu
{
//类型声明
char name[15];//名字
int age;//年龄

};
struct Stu s = {"zhangsan", 20};//初始化

结构体的内存对齐数

!计算结构体的大小,下面我们就来讨论一下最热门的考点:结构体内存对齐数

     结构体的对齐数规则

1、第一个成员位于0偏移处的位置

2、其他成员要对齐到某个数字(对齐数)的整数倍

      对齐数:为编译器所默认的对齐数与成员本身大小之间的最小值

3、结构体内存对齐数为所有成员中最大对齐数的整数倍

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

例题:

1、

typedef struct s1{
  int a;
  char b;
  short c;
  short d;
}AA_t;

分析:画图->

一个int a,整型需要4个字节,在0偏移处开始数,占四个格子,到3处,接下来char b 需要一个字节,最小对齐数为1,刚好在4处,此时4也 1的整数倍,到5处时,short是两个字节,和规定的编译器的8比较,明显是2比较小,但5不是2的整数倍,故要浪费一个字节,跳到6处才能填充short c,

接着short d同short c 最小对齐数为2,刚好来到8处,8是其整数倍,可直接填充,属下来包括浪费掉的空间,刚好是10个字节,其中4个最小对齐数:4 1 2 2中4是最大对齐数,此时10不是4的整数倍,故只能是12,所以该内存最大数为12.

运行代码

#include<stdio.h>
typedef struct s1 {
	int a;
	char b;
	short c;
	short d;
}AA_t;
int main()
{
	printf("%d", sizeof(struct s1));
}

结果:

 2、

在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少?

struct A
{
	int a;
	short b;
	int c;
	char d;
};

struct B
{
	int a;
	short b;
	char c;
	int d;
};

通过画图和代码运行结果均为16 12

画图分析如下

 左边为结构体A的图,右边为结构体B的图

以上两题均是笔试中常见类型,此题不再一一分析,读者可按照题一进行具体分析,也可看我画的图,或者自行画图理解,这样会深刻。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haru不是白仁仔呐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值