【嵌入式面试题】常见的面试题梳理一

C语言有多少关键字?
32个,注意sizeof是关键字,不是函数。

C程序的一般结构那些?
顺序,分支,循环

简单列举几种常用的循环结构和分支结构。
循环:For,while do,if goto(慎用)。
分支:if else, switch case(注意default 的使用,和break 的添加)。

while 和dowhile 有何区别?
前者先判断再执行,后者先执行再判断;后者比前者多执行一次。

continue 和 break 有何需别?
前者结束本次循环继续下次循环,后者直接退出循环。

register 有何作用?
声明一个变量常驻寄存器,直接从寄存器内使用变量,以达到提高程序运行效率的目的,在嵌入式开发中尤其常用,但它是一个建议性的声明,因为寄存器数量有限,编译器会根据程序情况决定是否申请成功。

static 有何作用?
限定存储域
限定作用域

volatile关键字有什么用途?
volatile 关键字是一种类型修饰符,声明为一个异变的变量,防止编译器优化,使每次变量使用与储存都要从内存进行。一般程序使用变量会将变量从内存取到寄存器中使用,当多次调用一个变量时,由于编译优化会导致每次直接从寄存器中使用变量,而变量本身存储的值不会发生改变。

指针函数和函数指针有和区别?
前者是 一个函数返回值 为 指针类型;
后者是 一个指针,指向 函数入口地址。

简述0,‘0’,“0”,'\0’的区别。
数值0
字符0(ascii码数值为48)
字符串0(占两个字节,有‘\0’作为结束符)
字符串结束标志(其数值等于0是绝对的0,但意义不同)

使用gets时应注意哪些事项?
防止越界,gets不检查目的地址的空间大小。

简述堆和栈的区别:
前者为程序员动态分配,创建和销毁都需要手动完成(使用完一定要销毁,防止内存泄露);
后者为系统自动分配,在函数返回时自动销毁(所以不能在函数中返回变量)。

函数传参有哪些方法?各有何特色?
值传递和地址传递,
前者在传递时函数形参接受实参的拷贝,所以原形参不会被改变(但是大数据的拷贝会降低效率);
后者传递变量的地址,不需拷贝,但是会改变参数的值。

全局变量和局部变量有何区别?
前者在静态区,作用域是整个程序;
后者在栈区,作用域仅限于函数内部。

局部变量能否和全局变量重名?
可以,但局部变量会屏蔽全局变量。

静态全局变量和普通全局变量有何区别?
存储域方面:都相同,都存储在静态区;
作用域方面:不同,前者只能在当前文件使用,后者是全局可见。

静态局部变量和普通局部变量有何区别?
作用域:相同,都在函数内部;
但是生命周期不同,前者生命周期为整个程序的生命周期知道程序退出后自动消亡;后者生命周期为一次函数调用,函数返回即销毁。

地址对齐方式有哪几种?
字节对齐,半字对齐,字对齐

结构体字节对齐问题

Struct a{
    Char a;
    Int b;
    Short c;
}
Sizeof(a) = ?
1
2
3
4
5
6
结构体a的大小是4*3=12个字节,而不是1+2+4=7个字节;这里主要考察内存对齐(地址对齐)的特点,应为结构体中最大数据宽度是整型(4字节),所以按字对齐。

程序的局部变量存在于(栈区)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆区)中。

结构体和联合体的区别?
都是用户自定义的类型,但结构体内的元素各自有着自己的内存空间,而联合体内的元素共用一块内存空间

宏函数与内联函数和普通函数的执行效率的比:
宏函数效率高,因为是编译器在预处理阶段的替换;

C语言中注释有哪些方法?
/* */和 #if 0 #endif 。
后者是预处理命令,可以方便的对代码区进行选择编译。

解释一下语句的含义:

const int a; 
int const a; 
const int *a; 
int * const a; 
const int const * a;
1
2
3
4
5
前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

int * a;
*a = 2;
1
2
上式有错吗,错到哪里?
指针没有得到地址

头文件中的 ifndef/define/endif 干什么用?
答:防止该头文件被重复引用。

#include <filename.h> 和 #include “filename.h” 有什么区别?
对于#include <filename.h> ,编译器从标准库路径开始搜索 filename.h
对于#include “filename.h” , 编译器从用户的工作路径开始搜索 filename.h

说明extern关键字的作用
(1)申明为外部变量或者函数,让函数和变量可以在定义变量或函数的文件外使用
(2)在C++中,申明为按照C语言的方式编译和链接

结构体与数组的区别
结构体可以包含不同的数据结构,是一个自定义类型,可以作为左值赋值。
而数组是一类数据类型的数据集合,它本身不是数据类型,所以不能作为左值赋值,数组名是常指针。

内存溢出和内存泄露有什么区别?
内存溢出是由于程序分配的空间,但不够使用,例如申请了一个4个字节的空间,但要使用的内容却是8个字节
内存泄漏,是由于申请了内存而无法释放。

如果判断单链表是否有环?
快慢指针,相遇则存在环
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/qq_51447215/article/details/126870470

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DJI嵌入式面试题是一个考察面试者在嵌入式系统设计和开发方面的能力和经验的问题。以下是对此题目的一个可能回答: 在DJI嵌入式面试题中,我们需要展示自己在嵌入式系统设计和开发方面的能力和经验。首先,嵌入式系统是一种集成度很高的计算机系统,通常嵌入在特定的设备中,具有实时性和稳定性的要求。因此,对于DJI这样的无人机制造商而言,嵌入式系统的设计非常重要。 在面试过程中,我们可能会被问到关于嵌入式系统设计和开发的问题。例如,如何设计一个满足实时性和稳定性要求的飞行控制系统?我们可以回答说,首先需要对传感器数据进行采集和处理,确保数据的准确性和实时性。然后,需要设计一个高效的控制算法,以响应不同的飞行指令,并保持飞行安全和稳定。此外,还需要考虑系统的可靠性和故障管理,以应对各种异常情况。 另一个可能的问题是关于嵌入式系统的软件开发。我们可以回答说,开发一个嵌入式系统的软件需要熟悉不同的编程语言,例如C或C ++。同时,我们需要了解嵌入式系统的硬件架构和接口,以便编写有效的驱动程序和应用程序。另外,了解嵌入式操作系统(例如,FreeRTOS)和实时调度器的原理也是非常重要的。 总之,在DJI嵌入式面试中,我们需要展示对嵌入式系统设计和开发的理解和经验。不仅要熟悉硬件和软件的开发,还要考虑系统的实时性、稳定性和可靠性。这样才能胜任嵌入式系统设计和开发的工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值