嵌入式C面试题总结

static的用途
一修饰变量
1、限制变量的作用域
2、修改变量的存储域(相对于局部变量而言)
3、具有记忆功能,保存上一次的值
二修饰函数
1、在模块内静态函数只可被该模块的函数调用

const的作用
1、表示为常量,不可修改
2、改变该变量的存储域
3、修饰函数参数时,防止参数被以外改变

实时系统
在规定的时间内完成特定的任务,具有实时性和可靠性

全局变量和局部变量的区别
1、全局变量存储在静态数据区,局部变量存储在堆栈区
2、全局变量的生命周期是整个函数区间,局部变量的生命周期是声明该变量的函数区间

全局变量和静态全局变量的区别
1、全局变量和静态全局变量都存储在静态数据区
2、全局变量的作用域是整个函数,静态全局变量的作用雨是声明该变量的模块

数组与链表的区别
数组是一块连续的内存区间、大小固定,数据只能连续存储
链表可以是一块连续的内存区间也可以是不连续的内存区间,大小不固定,数据可以随机存储

内核系统分为
进程管理系统、内存管理系统、I/O管理系统、文件管理系统

进程与线程的区别
进程是拥有资源的基本单位,线程是调度和分配的基本单位
线程和进程都可以并发执行

堆与栈的区别
堆是用户申请和释放,栈是系统自行分配和释放空间有限

进程死锁的原因
资源的竞争和程序的顺序执行

OSI(Open System Interconnection)模型
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
TCP/IP模型
应用层、传输层、网络层、数据链路层、物理层

Volatile变量的使用
告诉编译器这个变量随时可能改变,需要用到这个变量的时候直接从内存中读取
使用位置
1、并行设备的寄存器变量
2、中断函数中的非自动变量
3、多线程中的共享变量
一个参数既可以是const也可以为volatile,只读的状态寄存器
它是const是表示不应该试图去修改这个值;如果为volatile时
表示它有被意想不到的改变

中断与异常的区别
中断是外部硬件产生的电信号通过处理器的中断端口打断处理器的处理过程
异常是处理器内部执行到错误指令、或者在执行期间出现错误,必须靠内核处理的时候就会产生一个异常

嵌入式的中断函数
没有参数、没有返回值、不可执行不可重入的操作、不能执行浮点数的运算

三种基本的数据模型
层次模型、网状模型、关系模型

vi的编辑器具工作模式
命令模式、编辑模式、底行模式

嵌入式系统的介绍
以应用为为中心,以计算机技术为基础,软硬件可裁剪,对功耗、性能、可靠性、成本有严格要求的计算机系统

可重入的问题
可重入的问题一般出现在多任务的系统中,可重入即可被打断的函数,也就是说一个函数可以在任何时候被打断
执行的过程

TCP的三次握手
一、客户端向服务器发送一个同步信号
二、服务器接收到客户端的同步信号之后,给客户端回复一个ACK应答,同时也给客户端发送一个同步信号
三、客户端接收到服务器的同步信号和ACK后,给服务器回复一个ACK的应答

TCP
传输控制协议,面向连接、可靠的字节流服务
UDP
用户数据报协议,面向无连接的运输层协议

socket编程
客户端
socket->connect->write->close
服务器
socket->bind->accept->read->close

引用与指针的区别
1、引用必须被初始化,指针不一定需要初始化
2、引用被初始化之后不能在改变,指针初始化之后还能改变
3、不存在指向空的引用,但是存在只向空的指针

三种内存分配
1、从静态数据区分配:在程序编译的时候就已经分配好了,程序运行区间都存在
2、从栈上分配:在执行函数的时候,函数内部的局部变量可以在栈上申请空间,并随函数的结束而释放
3、从堆上分配:手动分配空间使用new和malloc,释放时使用deleted和free

指针函数
返回的类型是一个指针类型
函数指针
一个指针,这个指针指向的函数

野指针
野指针是很危险,if语句对它去不了任何的限制作用,因为野指针也是有指向某一个
地址,只是该地址有可能是合法也有可能是非法,最终有可能会导致程序崩溃
所以指针free或者delete完之后应该将指针指向NULL,避免产生野指针

C与C++的区别
C是结构化的语言,面向过程,基于算法和数据结构,所考虑的如何通过一个过程或者函数的输入得到输出
C++是面向对象的编程语言,基于类、对象、继承,所考虑的是去创建一个对象模型,让这个模型契合与之
对应的问题,通过对象的状态得到输出或者实现过程的控制

sizeof与strlen的区别
1、sizeof是运算符,strlen是函数
2、sizeof的参数可以是任何类型的数据类型,strlen的参数只能是字符串
3、数组为参数时sizeof不会退化为指针,strlen会退化为指针
4、sizeof是编译时算出,为常量,strlen在运行时才会算出

重载问题
面向过程的C语言不支持重载,但是面向对象的C++支持重载。因为C语言和C++语言经过编译器编译后的symbol库内的
名称不一样。C++语言经过编译器编译后在symbol库中的名字包含了函数名和参数的类型、数量,靠这种机制实现重载功能

指针与数组的区别
指针可以随时指向任意类型的内存块;数组只能在静态数据区上创建或者栈上被创建

动态数据存放在堆栈区,栈是一种线性结构,堆是一种链式结构。线程拥有自己的私有栈

open与fopen的区别
1、前者属于低级的IO,后者属于高级的IO
2、前者返回的是文件的句柄(文件描述符),后者返回的是文件指针
3、前者无缓冲,后者有缓冲
4、前者与read、write、getc配合使用,后者与fread、fwrite、fopen配合使用
5、后者是在前者的基础上发展而来的

缓冲文件系统与非缓冲文件系统的区别
缓冲文件,在内存中开辟一个“缓冲区”,当程序读数据时,现将数据从磁盘中读到内存的“缓冲区”,缓冲区填满之后再将数据读到保存的变量中;当执行写文件时,现将数据写到内存的“缓冲区”中,缓冲区填满之后再将数据写到磁盘中。
缓冲文件系统借助文件结构指针来对文件进行管理,通过文件指针对文件进行访问。
非缓冲文件系统依赖操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,效率高、速度快。

你可能感兴趣的:(面试题)