【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!

这篇具有很好参考价值的文章主要介绍了【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!,《C语言进阶篇》,c语言,面试,开发语言,c++

🎬 鸽芷咕:个人主页

 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》
⛺️生活的理想,就是为了理想的生活!

前言

   🌈hello! 各位宝子们大家好啊,今天给大家带来的是结构体的内存对齐这部分知识,可以说是干货满满啦!
   ⛳️在我们C语言的面试题中,结构体最容易考的就是内存对齐这部分知识点了。今天就给大家详细讲解一下!
   📚本期文章收录在《C语言高阶篇》,大家有兴趣可以看看呐
  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

💬 结构体内存对齐

  ⛳️大家可能会想结构体内存对齐这部分知识是干嘛用的呢?不要急,接下来就给大家 演示一下这部分内容到底能干嘛?
📚 代码演示:

#include<stdio.h>
struct S1
{
	char c1;//1
	int i;//4
	char c2;//1
};
struct S2
{
	int i;//4
	char c1;//1
	char c2;//1
};

int main()
{
	printf("%d", sizeof(struct S1));
	printf("%d", sizeof(struct S2));
	return 0;
}

  🌈在我们没学结构体内存对齐这部分知识前,我们肯定是按照以前计算内存大小的办法计算的。

  • printf(“%d”, sizeof(struct S1)); 计算类型大小而 S1 里面的类型有:

    • int char char 这三个加起来的大小不就是 4+1+1
    • 6 个字节嘛!结构体 S2S1
    • 包含的类型都是一样的那也就是 6 个字节了,可真的是这样吗?

📑 代码结果:
【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!,《C语言进阶篇》,c语言,面试,开发语言,c++

📝 诶这里S1的类型大小居然是 12,S2的类型大小居然是 8

  • 啊为什么会这样啊?这里就要用到结构体的内存对齐这个知识点了!
💭 ofsetof 宏的应用

📑 ofsetof是什么意思呢?

  • 它是用来计算结构体成员相较于起始位置的偏移量!
  • 在使用之前需要引入头文件#include <stddef.h>
    【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!,《C语言进阶篇》,c语言,面试,开发语言,c++

📖 问题引入:那么S1结构体每个元素的偏移量是多少?

  • 我们来用offsetof库函数来看一下

📚 代码演示:

#include <stdio.h>
#include <stddef.h>
struct S1
{
	char c1;
	int i;
	char c2;
};
int main()
{
	printf("%d\n", offsetof(struct S1, c1));
	printf("%d\n", offsetof(struct S1, i));
	printf("%d\n", offsetof(struct S1, c2));
	return 0;
}

📑 代码结果:

【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!,《C语言进阶篇》,c语言,面试,开发语言,c++

⛳️ 这里我们就可以看到结构体里面每个元素,相较于起始位置的偏移量

  • 🌱 那么我们就可以大概画出,结构体S1大概在内存中的存储位置
  • 🌱 假设我们结构体是从红箭头的位置开始存储的!
    【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!,《C语言进阶篇》,c语言,面试,开发语言,c++

⛳️ 这里哦!是不是就很直观呢?而画出来的结构体s1所占字节

  • 🌱 刚好是8个字节和我们前面计算的一模一样!
  • 🌱 这是为什么呢?
  • 🌱 这是因为结构体在存储是是有一定规则的
  • 🌱 下面就给大家讲讲结构体的内存对齐规则
✅ 结构体的内存对齐规则一

⛳️ 第一个成员在与结构体变量偏移量为0的地址处。

  • 🌱 也就是只要是在结构体里面的第一个成员。
  • 🌱 他都存储在结构体变量偏移量为0的地址处。

📑图片展示:
【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!,《C语言进阶篇》,c语言,面试,开发语言,c++

✅ 结构体的内存对齐规则二

⛳️ 其他成员变量要对齐到某个数字 (对齐数) 的整数倍的地址处。

  • 🌱 对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
    • VS中默认的值为8
    • Linux中没有默认对齐数,对齐数就是成员自身的大小

📜说明:

⛳️ 这是什么意思呢?拿上一个结构体参考

  • 🌱 假如我们第一个成员类型为1 ,第二个为4
  • 🌱 而VS中默认的值为 848
  • 🌱 取他们之间的较小值4对齐数
  • 🌱所以第二个成员应该放在 (对齐数) 4的整数倍的地址处。

📑图片展示:
【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!,《C语言进阶篇》,c语言,面试,开发语言,c++

✅ 结构体的内存对齐规则三

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

  • 🌱 也还是拿上面的结构体举例,前两个成员我们已经确定内存了
  • 🌱 而第三个是 char 一个字节,那么岂不是放上一个字节就对啦!
  • 🌱 那么这就和我们计算的12个字节完全不一样了!

📚 其实最后一个成员就是这样存储的,但是由于:

  • 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  • 而这个结构体 3 个成员类型分别是 1 4 1,那么
  • 结构体总大小就是 4的倍数 12 所以最后 3个字节也会算进去

【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!,《C语言进阶篇》,c语言,面试,开发语言,c++

✅ 结构体的内存对齐规则四

⛳️ 在讲规则四之前我们需要计算这结构体的存储字节以及:

  • 结构体每个元素的对齐数是多少?

📚 代码演示:

struct S3
{
	double d;
	char c;
	int i;
};

  ⛳️相信只要把前三个规则掌握了那么计算这个结构体每个成员 对奇数 其实很简单!我们来一起算一下

  • double的存储字节是8 VS的默认对齐数是8
  • 那么区最小值也是 8
  • char的存储字节是1 VS的默认字节是8
  • 那么取最小值就是 1
  • int 的存储字节是4 VS的默认字节是8
  • 那么取最小值就是 4

🔥 而结构体的大小数所有成员最大的整数倍,那么就是8的倍数!知道这些算结构体的大小还不简单

📑图片展示:
【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!,《C语言进阶篇》,c语言,面试,开发语言,c++
而如果嵌套了结构体的情况该怎么计算呢?

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

📚 代码演示:

#include <stdio.h>
#include <stddef.h>
struct S3
{
	double d;
	char c;
	int i;
};

struct S4
{
	char c1;
	struct S3 s3;
	double d;
};

int main()
{
	printf("%d\n", sizeof(struct S4));
	return 0;
}

⛳️ 这时候就需要结构体的内存对齐规则四了:

  • 🌱 当嵌套了结构体时,嵌套的结构体对齐到自己的最大对齐数的整数倍处
  • 🌱 结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
    🌱 我们来带着大家算一下

US3的最大对齐数是 8 ,所以Ustruct S3 s3;就应该对齐到自己最大的对齐数的整数倍

  • 而结构体s3的大小是 16 个字节所以这里就会申请 16 个字节存放s3
  • 存储 s3 ,而double也是8个字节所以下一个对齐数也是 8 的倍数
  • 那么这样不就好计算起来了!

📑图片展示:
【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!,《C语言进阶篇》,c语言,面试,开发语言,c++

📜 所以这里结构体S4的大小就是32个字节大家可以运行看一下呢?看看看和博主算的对不对!

💬 结构体内存对齐练习

  ⛳️好了上面的四个规则我们学完了就可以过来做一下练习来巩固一下自己所学习的知识 ,俗话说学习学习,光学不练有什么用呢?

💭 练习一

⛳️在VS2013下,默认对齐数为8字节,这个结构体所占的空间大小是( )字节

typedef struct{
  int a;
  char b;
  short c;
  short d;
}AA_t;
💭 练习二

⛳️在VS2013下,默认对齐数为8字节,这个结构体所占的空间大小是( )字节

struct tagTest1
  {
    short a;
    char d; 
    long b;   
    long c;   
  };
  struct tagTest2
  {
    long b;   
    short c;
    char d;
    long a;   
  };
  struct tagTest3
  {
    short c;
    long b;
    char d;   
    long a;   
  };
  struct tagTest1 stT1;
  struct tagTest2 stT2;
  struct tagTest3 stT3;

  int main()
  {
  		printf("%d %d %d", 
			  sizeof(stT1), 
			  sizeof(stT2), 
			  sizeof(stT3));
  		return 0;
 }
💭 练习三

⛳️在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;
};

总结

✅ 归纳:
好了以上就是关于结构体的内存对齐的全部知识点了,学会这些计算结构体的大小还不是手到擒来呢
  结构体的内存对齐规则一
  结构体的内存对齐规则二
  结构体的内存对齐规则三
  结构体的内存对齐规则四
  知识点练习
☁️ 把本章的内容全部掌握,那么恭喜你又距离编程大牛又进了一步!
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!,《C语言进阶篇》,c语言,面试,开发语言,c++文章来源地址https://www.toymoban.com/news/detail-578119.html

到了这里,关于【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL高阶知识点(一)事务的并发问题和隔离级别

    简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。 在 MySQL 中,事务支持是在 引擎层 实现的。 MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。 如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。

    2024年02月12日
    浏览(33)
  • 【字节面试】Fail-fast知识点相关知识点

    字节面试,问到的一个小知识点,这里做一下总结,其实小编之前有一篇文章,已经对此有过涉及,不过这里知识专项针对于问题,把这个知识点拎出来说一下。 什么是Fail-fast机制? Hashmap是否拥有Fail-fast机制? ConcurrentModificationException异常原因和解决方法是什么? 哪些你常

    2024年01月22日
    浏览(48)
  • Java 面试知识点

    基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的 语法,集合的语法,io 的语法,虚拟机方面的语法。 和都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true,否

    2024年02月16日
    浏览(42)
  • vue面试知识点

    Unsplash class 和 style 使用动态属性,使用驼峰式写法 v-if 和 v-show v-if 不渲染不满足判断条件的模块, v-show 渲染但不显示,使用场景:是否多次切换或频繁更新条件状态 keep-alive 缓存组件,使用场景:频繁切换,不需要重复渲染 v-for 中添加唯一的 key 为了高效的更新虚拟 DOM,

    2024年02月11日
    浏览(44)
  • 2023面试知识点一

    默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 t

    2024年02月07日
    浏览(39)
  • FPGA面试-常用知识点

    本贴记录一下自己找工作过程中顺下来的知识点,如有错误的,请不吝指出,共同进步!   a) FPGA FPGA 基于 LUT ,LUT本质上就是一个RAM,每一个LUT可以看成一个有4位地址线的16x1的RAM。这也是为什么FPGA需要外接一个rom来上电配置。 包括 CLBs , I/O 块, RAM 块和可编程连线 。 在

    2024年04月26日
    浏览(44)
  • 多线程面试相关知识点

    程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一

    2024年02月08日
    浏览(45)
  • java面试常见知识点

    JDK(Java Development Kit)是Java开发工具包,是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。 JRE是运行基于Java语言编写的程序所不可缺少的运行环境。JRE中包含了JVM,runtime class libraries和Jav

    2024年02月11日
    浏览(55)
  • 面试常见知识点--树的遍历

    算法流程 : 1. 先申请一个栈,记为 stk 。 2 .然后将根节点压入 stk 中。 3 .每次从 stk 中弹出栈顶节点,记为 cur ,然后打印 cur 的值。如果 cur 的右子树不为空,将 cur 的右子树压入 stk 中。如果 cur 的左子树不为空,将 cur 的左子树压入 stk 中。不断重复次步骤直到 stk 为空循

    2024年02月01日
    浏览(45)
  • 最全前端 HTML 面试知识点

    1.1.1 定义 超文本标记语言(英语:HyperTextMarkupLanguage,简称:HTML)是一种用于创建网页的标准标记语言 HTML元素是构建网站的基石 标记语言 (markup language ) 由无数个标记(标签、tag)组成 是对某些内容进行特殊的标记,以供其他解释器识别处理 使用标记的文本会被识别为“

    2024年02月20日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包