嵌入式面经 111道面试题汇总 免费技术答疑!

答案点这里 -->《嵌入式/C++面试题解析大全》

  • 网上嵌入式面经千千万,本人有国内大厂CVTE和世界500强工作经验,整理111道嵌入式常见面试题答案,承诺花精力提供专栏内容免费技术答疑!
  • 本专栏内容主要是面试过程口头提问的问题答案汇总,另分享C++资料、笔试真题集合、简历模板,欢迎嵌入式或者安卓交流哈!

alt

以下摘录于《嵌入式/C++面试题解析大全》专栏:

2.1 c和c++区别、概念相关面试题

2.1.1 new和malloc的区别⭐⭐⭐⭐⭐

解析:这个题目是我多次面试时被问到的最高频问题之一,建议各位童鞋必须弄懂。

答:

1)new、delete是C++中独有的操作符,而malloc和free是C/C++中的标准库函数。

2)使用new创建对象在分配内存的时候会自动调用构造函数,同时也可以完成对对象的初始化,同理要记得delete也能自动调用析构函数。因为malloc和 free是库函数而不是运算符,不在编译器控制范围之内,所以不能够自动调用构造函数和析构函数。也就是mallloc只是单纯地为变量分配内存,free也只是释放变量的内存。

3)new返回的是指定类型的指针,并且可以自动计算所申请内存的大小。而malloc返回的是void*类型,我们需要强行将其转换为实际类型的指针,并且需要指定好要申请内存的大小,malloc不会自动计算的。

4)C++允许重载new/delete操作符,而malloc和free是一个函数,并不能重载。

5)new内存分配失败时,会抛出bad_alloc异常。malloc分配内存失败时返回NULL。

6)内存区域:先了解自由存储区和堆,两者不相等于的。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配。new操作符从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。

2.1.2 malloc的底层实现⭐⭐⭐⭐

感谢:感谢牛友“杰兮”反馈,要更加深刻的了解C++内存管理,可参考侯捷老师的《C++内存管理》,侯捷老师就不用多说了,多本著作翻译者,《effective C++》《more effective C++》等,著有《STL源码剖析》,巨佬。以下解析是我在网上所查阅整理的。

解析:回顾进程的空间模型,如图2-1所示, alt

图2-1进程空间示意图

与1.1.5节的图相比,多了一个program break指针,Linux维护一个break指针,这个指针指向堆空间的某个地址。从堆起始地址到break之间的地址空间为映射好的,可以供进程访问;而从break往上,是未映射的地址空间,如果访问这段空间则程序会报错。我们用malloc进行内存分配就是从break往上进行的。 alt
图2-2堆内部机制

获取了break地址,也就是内存申请的初始地址,下面是malloc的整体实现方案:

malloc函数的实质是它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。 调用malloc()函数时,它沿着连接表寻找一个大到足以满足用户请求所需要的内存块。 然后,将该内存块一分为二(一块的大小与用户申请的大小相等,另一块的大小就是剩下来的字节)。 接下来,将分配给用户的那块内存存储区域传给用户,并将剩下的那块(如果有的话)返回到连接表上。 调用free函数时,它将用户释放的内存块连接到空闲链表上。 到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段, 那么空闲链表上可能没有可以满足用户要求的片段了。于是,malloc()函数请求延时,并开始在空闲链表上检查各内存片段,对它们进行内存整理,将相邻的小空闲块合并成较大的内存块。

2.1.3 在1G内存的计算机中能否malloc(1.2G)?为什么?⭐⭐

是有可能申请1.2G的内存的。

回答这个问题前需要知道malloc的作用和原理,应用程序通过malloc函数可以向程序的虚拟空间申请一块,与物理内存没有直接关系,得到的是在虚拟地址空间中的地址,之后程序运行所提供的物理内存是由操作系统完成的。

我们要申请空间的大小为1.2G=2 30 × 1.2 Byte ,转换为十六进制约为 4CCC CCCC ,这个数值还在 unsigned int 的表示范围。 malloc 函数要求的参数正是unsigned int。在当前正在使用的Windows环境中,可申请的最大空间超过1.9G。实际上,具体的数值会受到操作系统版本、程序本身的大小、用到的动态/共享库数量、大小、程序栈数量、大小等的影响,甚至每次运行的结果都可能存在差异,因为有些操作系统使用了一种叫做随机地址分布的技术,使得进程的堆空间变小。感兴趣的读者可以去研究操作系统中的相关内容。

综上,是有可能通过malloc( size_t ) 函数调用申请超过该机器物理内存大小的内存块的。

2.1.4指针与引用的相同和区别;如何相互转换?⭐⭐⭐⭐⭐

指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。

从内存分配上看:两者都是占内存的,程序为指针变量分配内存区域,在32位系统指针变量一般占用4字节内存,而

引用本质是指针常量,所指向的对象不能改变,但指向的对象的值可以改变,引用和指针一样是地址概念,所以本身都是会占用内存的(有的编译器优化后就不占用内存了)

。不过也略有区别,见下面的区别7.

  1. 指针是一个实体,而引用仅是个别名

  2. 指针和引用的自增(++)运算意义不一样,指针是对内存地址的自增,引用是对值的自增;

量或对象的地址)的大小;

  1. 引用使用时无需解引用(*),指针需要解引用;

  2. 引用只能在定义时被初始化一次,之后不可变;指针可变;

  3. 引用不能为空,指针可以为空;

6.引用没有const,指针有const;(本人当初看到这句话表示疑问,这里解释一下:指针有“指针常量”即int * const a,但是引用没有int& const a,不过引用有“常引用”即const int &a = 1)

  1. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小,在32位系统指针变量一般占用4字节内存。

1)指针转引用:把指针用*就可以转换成对象,可以用在引用参数当中。

2)引用转指针:把引用类型的对象用&取地址就获得指针了。

int a = 0;

int *pA = &a;

void fun(int &va){}

此时调用: fun(*pA);

pA是指针,加个*号后可以转换成该指针指向的对象,此时fun的形参是一个引用值,pA指针指向的对象会转换成引用va。

2.1.5 C语言检索内存情况 内存分配的方式⭐⭐⭐

检索内存:顾名思义,对某段内存进行遍历搜索。

内存分配:

1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

3、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

牛客高级系列专栏:

嵌入式

安卓

alt

全部评论
专栏搞得不错,蛮全面的😁
点赞 回复 分享
发布于 2023-05-04 15:44 江苏
😀对于求职的我们挺有针对性的
点赞 回复 分享
发布于 2023-05-06 12:05 湖北
非常不错的面经!!!
点赞 回复 分享
发布于 2023-05-08 11:20 重庆
及时雨
点赞 回复 分享
发布于 2023-05-10 12:05 广东

相关推荐

hanliu:1. 排版与格式问题字体与对齐问题:标题和内容的字体大小差异不够明显,无法迅速吸引目光。某些文字看起来有些拥挤(比如校园经历中的“班委成员”部分)。2. 内容逻辑性模块顺序问题:实习经历放在较靠后的位置,实际上这部分内容对应聘来说更重要,建议提前突出。细节表述不够突出:比如教育背景部分的专业课程仅仅列出名字,没有说明自己在这些课程中表现如何或者掌握了什么技能,缺乏量化描述。多余内容:例如“班委成员”和“宣传委员”这类校园经历,叙述过于普通,缺乏和岗位相关的实质性贡献。,建议简写。3. 措辞专业性表达不够精准:例如“协助班长与团支书更好地为同学服务”显得较为笼统,没有实际成果的体现。用词重复:如“学习了焊接”“学习了光检”等重复词语较多,缺乏丰富的动词来展示个人能力(如“负责”“优化”“改进”等)。技能展示不足:虽然列出了UG和CAD证书,但没有明确提到这些技能如何在实际工作中发挥作用。4. 技能匹配度技能深度不足:虽然列出了掌握的软件和技术,但没有描述技能水平(如“熟练掌握”“精通”),也没有具体案例支持这些技能。缺乏岗位导向性:比如针对机械设计与制造方向,实习经历提到了“E6尾灯项目”,但没有详细说明自己在其中的技术贡献,可能会显得经验描述泛泛而谈。5. 自我评价问题表达空泛:如“具有良好的沟通协调能力”“责任心强”之类的描述太常见,没有让人眼前一亮的特点。缺乏成果支持:自我评价中的能力没有用具体项目、经历或成就来验证,可信度较弱。 兄弟加油
点赞 评论 收藏
分享
评论
9
25
分享

创作者周榜

更多
正在热议
更多
# 听劝,这个简历怎么改 #
14064次浏览 182人参与
# 面试被问“你的缺点是什么?”怎么答 #
6244次浏览 98人参与
# 水滴春招 #
16185次浏览 332人参与
# 入职第四天,心情怎么样 #
11265次浏览 63人参与
# 租房找室友 #
7997次浏览 53人参与
# 读研or工作,哪个性价比更高? #
26139次浏览 356人参与
# 职场新人生存指南 #
199165次浏览 5506人参与
# 参加完秋招的机械人,还参加春招吗? #
26941次浏览 276人参与
# 文科生还参加今年的春招吗 #
4101次浏览 31人参与
# 简历无回复,你会继续海投还是优化再投? #
48608次浏览 561人参与
# 你见过最离谱的招聘要求是什么? #
144708次浏览 829人参与
# 如果重来一次你还会读研吗 #
155712次浏览 1706人参与
# 机械人选offer,最看重什么? #
69076次浏览 449人参与
# 选择和努力,哪个更重要? #
44261次浏览 492人参与
# 如果再来一次,你还会学硬件吗 #
103638次浏览 1245人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
20517次浏览 413人参与
# 招聘要求与实际实习内容不符怎么办 #
46662次浏览 494人参与
# 22届毕业,是读研还是拿外包offer先苟着 #
4652次浏览 27人参与
# 你们的毕业论文什么进度了 #
901179次浏览 8960人参与
# 软开人,你觉得应届生多少薪资才算合理? #
81368次浏览 496人参与
# 国企还是互联网,你怎么选? #
109188次浏览 853人参与
牛客网
牛客企业服务