avatar-decorate
获赞
1408
粉丝
2880
关注
6
看过 TA
6217
广州大学
2021
嵌入式软件开发
IP属地:北京
嵌入式软件工程师
私信
关注
1.Linux系统的组成部分有哪些?Linux内核、Linux文件系统、Linux shell、Linux应用程序。  2.Linux内核的组成部分有哪些?(1)第一种分类方式:内存管理子系统、进程管理子系统、文件管理子系统、I/O管理子系统。 (2)第二种分类方式:进程调度(SCHED)、进程间通信(IPC)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)。 3.Linux内存管理模块MMU的作用是?(1)地址映射。 (2)内存分配和回收。 (3)内存保护。 (4)内存扩充。 4.操作系统调度策略有哪些?答案:(1)先来先服务(FCFS)。 (2)短进程优先(SPF)。 (3)高响应比优先(HRN)。 (4)时间片轮转(RR)。 (5)多级反馈队列(RRWMF)。 (6)最高优先权优先(FPF)。 解析:(1)先来先服务(FCFS):每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。 (2)短进程优先(SPF):从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。 (3)高响应比优先(HRN):在短作业优先的基础上,使作业的优先级随着等待时间的增加而以速率a 提高,则长作业在等待一定的时间后,必然有机会分配到处理机。 (4)时间片轮转(RR):将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU 分配给队首进程,并令其执行一个时间片,时间到了之后将它送往就绪队列的末尾。接着调度下一个队首进程……如此循环。 (5)多级反馈队列(RRWMF): ①设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。例如,第二个队列的时间片要比第一个队列的时间片长一倍,第i + 1个队列的时间片要比第i个队列的时间片长一倍。 ②当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,如此下去,当一个长进程从第一队列依次降到第n队列后,在第n 队列便采取按时间片轮转的方式运行。 ③仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程。 (6)最高优先权优先(FPF):把处理机分配给就绪队列中优先权最高的进程,这时,又可进一步把该算法分成如下两种: ①非抢占式优先权算法:系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。这种调度算法主要用于批处理系统中,也可用于某些对实时性要求不严的实时系统中。 ②抢占式优先权调度算法:系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。  5.满足短作业优先又不会发生饥饿现象的操作系统调度策略是哪种?高响应比优先。  6.Linux I/O子系统的层次结构是怎样的?从上到下依次是用户层I/O软件,设备独立性软件,设备驱动程序,中断处理程序。  7.逻辑地址、线性地址、物理地址、总线地址、虚拟地址有什么区别?(1)逻辑地址:与内存段相关的偏移地址部分。例如,在C语言获取指针变量的值,就是逻辑地址,不和绝对的物理地址相关。 (2)线性地址:线性地址 = 逻辑地址 + 基地址。 (3)物理地址:如果启用了分页机制,那么线性地址使用页表项变换后就是物理地址。如果没有启用分页机制,那么线性地址就是物理地址。 (4)总线地址:x86下的I/O地址,ARM下的物理地址。(在x86下,外设的I/O地址是独立的,即有专门的指令访问外设I/O,I/O地址就是"总线地址",而RAM地址就是"物理地址"。在ARM下,I/O和RAM统一编址,但linux为了统一各个平台,仍然保留这个概念,总线地址其实就是物理地址。) (5)虚拟地址:MMU虚拟出来的地址。  8.你了解操作系统的内存分配方式吗?(1)分页存储管理:优点是不需要连续的内存空间,且内存利用率高(只有很小的页内碎片);缺点是不易于实现内存共享与保护。 (2)分段存储管理:优点是易于实现段内存共享和保护;缺点是每段都需要连续的内存空间,且内存利用率较低(会产生外部碎片)。 (3)段页式存储管理:优点是不需要连续的内存空间,内存利用率高(只有很小的页内碎片),且易于实现段内存共享和保护;缺点是管理软件复杂性较高,需要的硬件以及占用的内存也有所增加,使得执行速度下降。以上内容摘自专刊《嵌入式岗位笔试面试真题讲解》,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:  #牛客AI配图神器#
0 点赞 评论 收藏
分享
1.ARM处理器与中断(15道) 1.1 CPU的内部结构?CPU的内部结构大致可以分为: (1)控制单元(指令寄存器、指令译码器、操作控制器)。 (2)运算单元(算术逻辑单元)。 (3)存储单元(专用寄存器和通用寄存器) (4)时钟。 1.2 CPU跟内存、虚拟内存、硬盘的关系?(1)CPU要调用的程序和数据来自硬盘,但是CPU又不能直接读写硬盘上的系统、程序和数据,所以必须先将硬盘的内容存储在内存中,才能被CPU读写。 (2)因此内存是一个中转站,对计算机的运行速度有较大影响。 (3)当系统需要的内存空间大于实际的物理内存空间时,就需要用到虚拟内存了。虚拟内存可以将部分硬盘空间模拟成内存空间,将暂时不运行的程序和不使用的数据存储在硬盘上,需要时再将其存储到内存。 1.3 ARM结构处理器可分为哪几类?嵌入式微处理器 由通用计算机的CPU演变而来,位数在32位以上,具有较高的性能。 嵌入式微控制器 又称单片机,一般以某一种微处理器内核为核心,芯片内部集成ROM、RAM、总线、定时/ 计数器、I/O、A/D等各种必要功能和外设。 嵌入式DSP 硬件结构和指令进行过特殊设计,非常擅长高速实现各种数字信号处理运算(如数字滤波、频谱分析等)。 1.4嵌入式微处理器和DSP 有什么区别?(1)嵌入式微处理器和DSP一个偏重控制、一个偏重运算。 (2)嵌入式微处理器外围接口丰富,标准化、通用性、功耗控制等做得很好,适用于消费电子、家用电器等控制领域。 (3)DSP对系统结构和指令做了优化,能进行大量数据的快速计算,适用于音视频处理等领域。 1.5 ARM处理器有哪些工作状态?ARM 指令和Thumb 指令有什么区别?答案:(1)ARM处理器共有ARM、Thumb/Thumb-2、调试三种状态。 (2)ARM指令是32位的,较全面;Thumb指令是16位的,较精简。 解读:ARM状态 工作于32位指令状态,所有指令均为32位。 Thumb状态 工作于16位指令状态,所有指令均为16位。 Thumb-2状态 ARM状态和Thumb状态是早期版本,近期推出的Thumb-2状态兼有 16和32位指令,具有更高的性能、更低的功耗以及更少的内存占用。具有Thumb-2技术的 ARM处理器无需在ARM和Thumb-2状态之间切换了。 调试状态 处理器停机调试。 以上内容摘自专刊《嵌入式岗位笔试面试真题讲解》,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:              https://blog.nowcoder.net/zhuanlan/v0ELPM嵌入式公司推荐:华为、小米、OPPO、VIVO、荣耀、一加、CVTE、大疆、insta360影石、美的 、TCL、海信、创维、烽火、比亚迪、吉利、长安、大众、经纬恒润 、小鹏、图森未来、百度、滴滴、蔚来、理想、 联发科、 紫光展锐 、全志、寒武纪 、晶晨半导体 、汇顶、华为、中兴、浪潮 、TP-LINK、讯飞、商汤、海康威视 、浙江大华、360、小马智行、元戎启行、深信服、移动、联通、电信、旷视、四维图新、中芯国际、复旦微电子、极氪。#牛客AI配图神器#
0 点赞 评论 收藏
分享
1.预处理&关键字(22道) 1.1宏定义是在编译的哪个阶段被处理的?答案:宏定义是在编译预处理阶段被处理的。 解读:编译预处理:头文件包含、宏替换、条件编译、去除注释、添加行号。 1.2写一个" 标准"宏 MIN ,这个宏输入两个参数并返回较小的一个。答案: #define  MIN(            A, B)  ((A) <= (B)? (                A) : (B))   解读:(1)注意这个题目要用三重条件操作符,在宏中要小心地把参数用括号括起来,并且整个宏也要用括号括起来,防止替换时出现错误。 (2)注意若写"least = MIN(*p++, b);"这句代码会产生副作用,将*p++代入宏体,指针p会做两次自增操作。 1.3已知数组table ,用宏求数组元素个数。答案: #            define  COUNT(table)  (sizeof(                table) / sizeof(table[                    0]))  解读:sizeof(table)得到数组长度,sizeof(table[0])得到数组元素长度,两者相除即可得到数组元素个数。 1.4带参宏和函数的区别?(1)带参宏只是在编译预处理阶段进行简单的字符替换;而函数则是在运行时进行调用和返回。 (2)宏替换不占运行时间,只占编译时间;而函数调用则占运行时间(分配单元、保留现      场、值传递、返回)。 (3)带参宏在处理时不分配内存;而函数调用会分配临时内存。 (4)宏不存在类型问题,宏名无类型,它的参数也是无类型的;而函数中的实参和形参都要定义类型,二者的类型要求一致。 (5)而使用宏定义次数多时,宏替换后源程序会变长;而函数调用不使源程序变长。 1.5内联函数的优缺点和适用场景是什么?(1)优点:内联函数与宏定义一样会在原地展开,省去了函数调用开销,同时又能做类型检查。 (2)缺点:它会使程序的代码量增大,消耗更多内存空间。 (3)适用场景:函数体内没有循环(执行时间短)且代码简短(占用内存空间小)。 1.6关键字volatile 的作用是什么?给出三个不同的例子。(1)作用:告诉编译器不要去假设(优化)这个变量的值,因为这个变量可能会被意想不到地改变。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。 (2)例子: ①并行设备的硬件寄存器(如:状态寄存器)。 ②一个中断服务子程序中会访问到的非自动变量。 ③多线程应用中被几个线程共享的变量(防止死锁)。 以上内容摘自专刊《嵌入式岗位笔试面试真题讲解》,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:              https://blog.nowcoder.net/zhuanlan/v0ELPM嵌入式推荐公司:华为、    小米     、OPPO、VIVO、荣耀、一加、     CVTE、 大疆 、insta360影石、      美的 、 TCL    、 海信、创维、烽火、比亚迪    、吉利、长安、大众、经纬恒润 、小鹏、    图森未来、 百度 、     滴滴、蔚来、理想、 联发科、 紫光展锐 、全志、     寒武纪 、晶晨半导体 、汇顶、     华为、     中兴、    浪潮 、TP-LINK、讯飞、商汤、     海康威视 、浙江大华      、360、小马智行、元戎启行    、深信服      、移动、联通、电信、旷视     、四维图新      、中芯国际      、复旦微电子、极氪QSWp7XkShEuNKArT7CnOKHBIhjGLeBcP.jpg #牛客AI配图神器#  #牛客AI配图神器#
0 点赞 评论 收藏
分享
1.1 Linux 驱动程序的功能是什么?(1)对设备初始化和释放。(2)进行内核与硬件的数据交互。(3)检测和处理设备出现的错误。1.2内核程序中申请内存使用什么函数?答案:kmalloc()、kzalloc()、vmalloc()。解读:(1)void *kmalloc(size_t size, gfp_t flags);①申请连续的物理内存,这对于要进行DMA的设备十分重要,但大小不能超过128KB,其中有16B是被页描述符占用了。②较常用的flag有GFP_ATOMIC(分配内存的过程是一个原子过程)、GFP_KERNEL(正常分配内存)、GFP_DMA(给DMA控制器分配内存)。③对应的内存释放函数为void kfree(const void *objp)。(2)void *kzalloc(size_t size, gfp_t flags);①kzalloc()相对kmalloc()只是额外增加了__GFP_ZERO标志,除了申请内存外,还会对申请到的内存内容清零。②对应的释放函数也是kfree()。(3)void *vmalloc(unsigned long size);①申请虚拟地址连续的内存空间,但其对应的物理内存不一定连续,因此对申请的内存大小没有限制。②对应的内存释放函数为void free(const void *addr)。③注意:vmalloc()和vfree()可以睡眠,因此不能在中断上下文调用。1.3内核程序中申请内存和应用程序时申请内存有什么区别?答案:内核中申请内存空间用的是函数kmalloc、kzalloc、vmalloc,应用程序申请内存用的函数是malloc。解读:(1)kmalloc/kzalloc直接分配连续的物理地址(虚拟地址也是连续的)。(2)vmalloc分配连续的虚拟地址,但物理地址不一定连续。分配时实际分配了物理内存,不过这个物理内存页面是在公共的页表进行了映射,并没有在本进程的页表进行映射,当访问这段内存时,触发do_page_fault异常(缺页中断)才完成页表的同步工作。(4)malloc是用户空间申请内存的方法,分配连续的虚拟地址,物理地址一般不会连续。在分配时并没有做实际物理页的分配动作,实际分配物理页的动作是在do_page_fault异常(缺页中断)处理中完成的。1.4自旋锁和信号量在互斥使用时需要注意什么?在中断服务程序里面的互斥是使用自旋锁还是信号量? (1)使用自旋锁的进程不会睡眠, 而使用信号量的进程会睡眠。(2)中断服务程序使用的是自旋锁,原因是中断服务程序处于中断上下文,中断上下文是不参与调度的,也就没有保护现场与恢复现场,一旦睡眠就回不来了。 以上内容摘自专刊《嵌入式岗位笔试面试真题讲解》,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:              https://blog.nowcoder.net/zhuanlan/v0ELPM嵌入式公司推荐:华为、小米、OPPO、VIVO、荣耀、一加、CVTE、大疆、insta360影石、美的 、TCL、海信、创维、烽火、比亚迪、吉利、长安、大众、经纬恒润 、小鹏、图森未来、百度、滴滴、蔚来、理想、 联发科、 紫光展锐 、全志、寒武纪 、晶晨半导体 、汇顶、华为、中兴、浪潮 、TP-LINK、讯飞、商汤、海康威视 、浙江大华、360、小马智行、元戎启行、深信服、移动、联通、电信、旷视、四维图新、中芯国际、复旦微电子、极氪。#牛客AI配图神器#
0 点赞 评论 收藏
分享
2.1   用变量  a   给出下面的定义   (1)一个整型数: int a。  (2)一个指向整型数的指针(一重指针): int *a。  (3)一个指向指针的的指针,它指向的指针是指向一个整型数的指针(二重指针): int **a。  (4)一个有10个整型数的数组 :int a[10]。  (5)一个有10个指针的数组,这10个指针是指向整型数的(指针数组): int *a[10]。  (6)一个指向有10个整型数数组的指针(数组指针):int (*a)[10]。  (7)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(函数指针):int (*a)(int)。  (8)一个有10个指针的数组,这10个指针均指向函数,该函数有一个整型参数并返回一     个整型数(函数指针数组): int (*a[10])(int)。 2.2 下面的代码输出是什么,为什么?  void  foo(void){    unsigned  int a = 6;    int b = -20;    (a + b > 6)? printf("> 6") : printf(" <= 6");}答案:输出是  ">6"。 解读:当运算表达式中存在有符号数和无符号数时,有符号数隐式转换成了无符号数(即底层的补码不变,但是此数从有符号数变成了无符号数)。注意,正数的补码为其本身,负数的补码为其反码+1。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果  ">6"。 2.3   写出  float x   与"零值"比较的  if   语句。答案: if(x >= -0.000001 && x <= 0.000001)解读:因为计算机在处理浮点数的时候是有误差的,所以不能将浮点型变量用"=="或"!="与数字比较,应该设法转化成">="或"<="此类形式。 2.4 下面代码有什么错误? #include void  main() {    char *s = "AAA";    s[0] = 'B';    printf("%s", s);}(1)"AAA"是字符串常量,s是指针,指向这个字符串常量,所以声明s的时候就有问题,应该是cosnt char* s="AAA"。  (2)然后又因为是常量,所以对是s[0]的赋值操作是不合法的。 2.5 下面代码输出是什么? #include void  main() {    int *a = (int *)2;    printf("%d", a + 3);}答案:输出是14。 解读:代码将数值2强制类型转换为int类型指针,int类型指针加3 相当于指向后面第三个int类型变量的首地址,一个int类型变量占4个字节,所以加3相当于指针往后移了12个字节,指向地址14处。以上内容摘自牛客官方专刊《嵌入式岗位笔试面试真题讲解》,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:    https://blog.nowcoder.net/zhuanlan/v0ELPM嵌入式公司推荐:华为、小米、  OPPO、VIVO、荣耀、一加、   CVTE、   大疆 、insta360影石、  美的 、   TCL 、 海信、创维、烽火、比亚迪、吉利、长安、大众、  经纬恒润 、小鹏、  图森未来、  百度 、   滴滴、蔚来、理想、 联发科、  紫光展锐 、全志、   寒武纪 、  晶晨半导体 、汇顶、   华为、  中兴、   浪潮 、  TP-LINK、讯飞、商汤、   海康威视 、浙江 大华   、360、小马智行、  元戎启行   、  深信服   、移动、联通、电信、旷视、四维图新、中芯国际、复旦微电子。  #嵌入式找工作#
0 点赞 评论 收藏
分享
4.综合题(18道) 4.1 下面代码输出是几?int main()  {      int j = 2;      int i = 1;      if(i = 1) j = 3;      if(i = 2) j = 5;      printf("%d", j);  }  答案:输出为5。 解读:注意if的条件语句用的是赋值符"="而不是等号"==",因此条件一直为真。 4.2 负数和正数的反码、补码分别是什么?(1)负数的反码:对原码除符号位外的其余各位逐位取反就是反码。 (2)负数的补码:负数的补码就是对反码加1。 (3)正数的原码、反码、补码都一样。 4.3 编译和链接有什么不同?(如对外部符号的处理)(1)编译(+汇编)生成的是目标文件(*.o)。编译过程中对于外部符号(如用extern跨文件引用的全局变量)不做任何解释和处理,外部符号对应的就是"符号"。 (2)链接生成的是可执行程序。链接将会解释和处理外部符号,外部符号对应的是地址。 4.4 函数参数的传递方式有几种?(1)两种:值传递、指针传递。 (2)严格来看,只有一种传递,值传递,指针传递也是按值传递的,复制的是地址。 4.5 局部变量能否和全局变量重名?  答案:能,局部会屏蔽全局。要用全局变量,需要使用"::"。 注意:对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 4.6如何引用一个已经定义过的全局变量? 答案:可以用引用头文件的方式(不建议,可能会造成重复定义),也可以用extern关键字。 注意:(1)如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变量写错了,那么在编译期间会报错。 (2)如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在链接期间报错。 以上内容摘自牛客官方专刊《嵌入式岗位笔试面试真题讲解》,数千位同学已订阅,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:  https://blog.nowcoder.net/zhuanlan/v0ELPM推荐公司:华为、小米 、OPPO、VIVO、荣耀、努比亚、CVTE 、 大疆、insta360影石、美的、 TCL、创维、海信、海尔、长虹、烽火、经纬恒润 、小鹏、图森未来、 百度、滴滴、蔚来、理想、比亚迪、吉利、小马智行、元戎启行、摩拜、豪威、 联发科、 紫光展锐、全志、 寒武纪、晶晨半导体、汇顶、 华为、中兴、浪潮、TP-LINK、讯飞、商汤、海康威视、浙江 大华、旷视、360。 #嵌入式找工作#
0 点赞 评论 收藏
分享
3.内存管理&编程题(20道) 3.1由gcc编译的C语言程序占用的内存分为哪几个部分?栈区(stack)存放函数的参数、局部变量。堆区(heap)提供程序员动态申请的内存空间。全局(静态)区(static)存放全局变量和静态变量,初始化不为0的全局变量和静态变量、const型常量在一块区域(.data段),未初始化的、初始化为0的全局变量和静态变量在相邻的另一块区域(.bss段)。程序代码区存放函数体的二进制代码和字符串常量。3.2小端:一个数据的低位字节数据存储在低地址   大端:一个数据的高位字节数据存储在低地址   例如:int a=0x12345678;  //a首地址为0x200,大端存储格式如下:如何判读一个系统的大小端存储模式?(1)方法一:int *强制类型转换为char *,用"[]"解引用 void checkCpuMode(void)  {      int c = 0x12345678;      char *p = (char *)&c;      if(p[0] == 0x12)          printf("Big endian.");      else if(p[0] == 0x78)          printf("Little endian.");      else          printf("Uncertain.");  }  (2)方法二:int *强制类型转换为char *,用"*"解引用 void checkCpuMode(void)  {      int c = 0x12345678;      char *p = (char *)&c;      if(*p == 0x12)          printf("Big endian.");      else if(*p == 0x78)          printf("Little endian.");      else          printf("Uncertain.");  }  (3)方法三:包含short跟char的共用体 void checkCpuMode(void)  {      union Data      {          short a;          char b[sizeof(short)];      }data;      data.a = 0x1234;        if(data.b[0] == 0x12)          printf("Big endian.");      else if(data.b[0] == 0x34)          printf("Little endian.");      else          printf("uncertain.");  }  3.3全局变量和局部变量的区别?(1)全局变量储存在静态区,进入main函数之前就被创建,生命周期为整个源程序。 (2)局部变量在栈中分配,在函数被调用时才被创建,在函数退出时销毁,生命周期为函数内。 3.4以下程序中,主函数能否成功申请到内存空间?#include  #include  #include  void getmemory(char *p)  {      p = (char *)malloc(100);      strcpy(p, "hello world");  }  int main()  {      char *str = NULL;      getmemory(str);      printf("%s", str);      free(str);      return 0;  }  答案:不能。 解读:getmemory(str)没能改变str的值,因为传递给子函数的只是str的复制值NULL,main函数中的str一直都是 NULL。正确的getmemory()如下: ①传递的是二重指针,即str的指针void getmemory(char **p)   {      *p = (char *)malloc(100);      strcpy(*p, "hello world");  }  ②传递的是指针别名,即str的别名,C++中void getmemory(char * &p)   {      p = (char *)malloc(100);      strcpy(p, "hello world");  }  以上内容摘自专刊《嵌入式岗位笔试面试真题讲解》,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:                  https://blog.nowcoder.net/zhuanlan/v0ELPM嵌入式公司推荐:   华为       、    小米         、     OPPO       、VIVO、     CVTE         、     大疆       、insta360影石、美的  、   TCL  、小米    、经纬恒润     、小鹏、 图森未来    、   百度    、滴滴、蔚来、理想、     联发科、 紫光展锐    、全志、   寒武纪    、晶晨半导体   、汇顶、华为     、 中兴    、浪潮    、TP-LINK、    讯飞、商汤、海康威视    、浙江   大华    、360。qi
查看4道真题和解析
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客企业服务