嵌入式面试总结
C语言中struct和union的区别
struct和union都是常见的复合结构。
- 结构体和联合体虽然都是由多个不同的数据类型成员组成的,但不同之处在于联合体中所有成员共用一块地址空间,即联合体只存放了一个被选中的成员,结构体中所有成员占用空间是累加的,其所有成员都存在,不同成员存放在不同的地址。在计算一个结构型变量的总长度时,其内存空间大小等于所有成员长度之和(需要考虑字节对齐),而在联合体中,所有成员不能同时占用空间,它们不能同时存在,一个联合体变量的长度等于其最长的成员长度。
- 对于联合体的不同成员赋值,将会对它的其它成员重写,原来成员的值就不存在了,而对结构体的不同成员赋值是互不影响的。

DATA占用20字节,而union中double占了8个字节,因此union要8个字节对齐,因此大小为24。
data = 4 + 24 + 8 = 36,按8字节对齐,40字节。
所以结果为64字节。
左值和右值是什么?
左值是指可以出现在等号左边的变量或表达式,它最重要的特点就是可写。也就是说,它的值是可以被修改的,如果一个变量或表达式的值不能被修改,那么就不能作为左值。
右值是指可以出现在等号右边的变量或表达式,它最重要的特点是可读,一般的使用场景是把一个右值赋给一个左值。
通常,左值可以作为右值,但右值不一定是左值。
什么是短路求值

对于或运算,如果第一个表达式为真,不需要执行第二个表达式。
对于与运算,如果第一个表达式为假,不用执行后面语句。
++a和a++有什么区别?
a++;
int temp = a;
a = a + 1;
return temp;
++aa = a+1;
return a;
后置自增运算符需要把原来变量的值复制到一个临时的存储空间,等运算结束后才返回这个临时变量的值。
所以前置自增运算符效率比后置自增运算符要高
C语言中内存分配的方式有几种?
- 静态存储区分配。
内存分配在程序编译之前完成,且在程序的整个运行期间都存在,例如全局变量,静态变量等。 - 栈上分配。
函数执行时,函数内的局部变量的存储单元在栈上创建,函数执行结束时这些存储单元自动释放。 - 堆上分配。
由程序员手动分配和释放。
堆与栈有什么区别
- 申请方式
栈的空间由操作系统自动分配/释放,堆上的空间手动分配/释放。 - 申请大小的限制
栈空间有限,在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。栈顶地址和最大容量是系统预先设定好的,如果申请空间超过剩余栈空间时,将提示overflow,因此,能从栈获得的空间较小。
堆是向高地址扩展的数据结构,是不连续的内存区域。由于系统是使用链表来存储空间内存地址的,堆的大小受限于计算机系统中有效的虚拟内存,因此,堆获得的空间比较灵活,也比较大。 - 申请效率
栈是由系统自动分配,速度较快,但程序员无法控制。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。
栈的作用
- 用来存储临时变量,包括函数参数和函数内部定义的临时变量。函数的返回地址,寄存器均保存在栈中,函数返回后从栈中恢复寄存器的值。
- 每个线程都有自己的栈,用来存储本线程运行时各个函数的临时变量和维系函数调用和返回时的函数调用关系。
C语言函数参数压栈顺序是怎样的?
从右至左。
C语言参数入栈顺序的好处就是可以动态变化参数个数。
自左向右的入栈方式,最前面的参数被压在栈底。除非知道参数个数,否则无法通过栈指针的相对位移求得最左边的参数。
函数指针和指针函数区别
函数指针
如果程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名就是这个地址。
既然是地址就可以定义一个指针变量来存放,这个指针变量就叫做函数指针变量。
int (*p)(int, int);
指针函数
函数的返回值是指针变量。
int *func(int, int);
易错题型
sizeof既是关键字,也是运算符。
%取余运算符只能用于整型,A%B——A、B都必须为int类型。
BSS段:通常是用来存放程序中未初始化的全局变量和静态变量的一块内存区域。是可读写的,在程序执行之前,BSS段就会自动清零。

初始化列表的初始化顺序是按照成员声明顺序而来,先执行a(b),此时b没有初始化,因此为随机值,b为12。

对于对象 A,包含一个虚函数指针,因此对齐到 8 字节,然后有 2 个 char 型,最后补齐到 8 字节整倍数,因此其长度为 16 。
在Linux系统中,可以用来查找可执行文件的是?
- whereis:搜索可执行文件、联机帮助文件、源代码文件。
- locate所有文件
- which可执行文件
快速排序两趟结果,起码有2个元素就位。



文件共享
同一个文件(譬如磁盘上的同一个文件,对应同一个inode)被多个独立的读写体同时进行IO操作。
多个独立的读写体大家可以将其简单理解为对应同一个文件的多个不同的文件描述符,譬如多次打开同一个文件所得到的多个不同的fd。
多个进程间实现文件共享


原子操作
O_APPEND:移动指针到末尾+写入数据是原子操作。
pread()和pwrite():移动指针+写入是原子操作。但不更新文件表中的当前位置偏移量。
O_EXCL:判断文件是否存在+创建文件是原子操作。
截断文件
int truncate(const char*name, length);int ftruncate(int fd, off_t length);
将文件截断为参数length指定的字节长度,如果文件目前的大小小于参数length指定的大小,则多余的数据将被丢失,如果文件大小小于参数length指定的大小,则将其进行扩展为空字节。
fcntl和ioctl函数
对一个已经打开的文件描述符执行一系列控制操作。
int fcntl(int fd, int cmd, ...);
标准I/O库
标准C库当中用于文件I/O操作相关的一套库函数,使用标准I/O需要包含头文件。
标准I/O与文件I/O之间的区别:
- 标准I/O是库函数,文件I/O是系统调用。
- 标准I/O是对文件I/O的封装。
- 标准I/O比文件I/O有更好的可移植性。
- 标准I/O在效率上要优于文件I/O。
标准I/O使用FILE指针作为文件句柄,与文件I/O中的文件描述符相似。
标准I/O使用fopen()函数打开。
man 3 fopen()


fopen()函数新建文件时无法手动指定文件的权限,但有一个默认值0666.
printf函数是将用户的数据写入到标准输出(1)。
write(1, "Hello World\n", 12);

这5个函数都是可变参数,它们都有一个共同的参数format,这是一个字符串,称为格式控制字符串,用于指定后续的参数是如何进行格式转换,所以才把这些函数称为格式化输出。
printf()函数用于将格式化数据写入到标准输出;
fprintf()和dprintf()都是将格式化数据写入到指定文件中,fprintf()使用FILE指针指定对应的文件,dprintf()使用文件描述符fd指定对应的文件;
sprintf()和snprintf()函数可将格式化数据存储在用户指定的缓冲区buf中。sprintf()函数会在字符串末尾加上一个字符串终止字符’\0’;
%o:输出八进制表示的整数。
%u:输出无符号十进制。
%x/X:输出无符号十六进制
width:最小输出宽度,用十进制来表示输出的最小数,若实际的输出位数大于width,以实际的位数进行输出;若实际的位数小于指定输出的最小位数,则flags补0。
printf("%06d",1000);
格式化输入

scanf()函数用于将用户输入(标准输入)的数据进行格式化转换;fscanf()函数从FILE指针指定文件中读取数据,并将数据进行格式化转换;
sscanf()函数从参数str所指向的字符串中读取数据,并将数据进行格式化转换。
I/O缓冲
出于速度和效率的考虑,系统I/O调用(即文件I/O,open,read等)和标准C语言库I/O函数(即标准I/O函数)在操作磁盘文件时会对数据进行缓冲。
read()和write()系统调用在进行文件读写操作的时候不会直接访问磁盘设备,而是仅仅在用户空间缓冲区和内核缓冲区之间复制数据。
譬如调用write()函数将5个字节数据从用户空间内存拷贝到内核空间的缓冲区中。
write(fd, "Hello", 5);
调用write()后仅仅是将这5个字节拷贝到了内核空间的缓冲区中,拷贝完成之后函数就返回了,在后面的某个时刻,内核会将其缓冲区中的数据写入到磁盘设备中。
由此可知,系统调用write()与磁盘操作并不是同步的,write()并不会等数据真正写到磁盘之后再返回。

这个缓冲区称为文件I/O的内核缓冲。
读文件时,内核会从磁盘设备中读取文件的数据并存储到内核的缓冲区中,当调用read()函数读取数据时,read()调用将从内核缓冲区中读取数据,直至把缓冲区中的数据读完,这时,内核会将文件的下一段内容读入到内核缓冲区中进行缓存。
这个内核缓冲区称为文件I/O的内核缓冲。为了提高文件I/O的速度和效率,使得系统调用read()等操作更快速,不需要等待磁盘操作,磁盘操作通常是比较缓慢的。
刷新文件I/O的内核缓冲区
强制将文件I/O内核缓冲区中缓存的数据写入到磁盘设备中,对于某些应用来说,可能是很有必要的,应用程序在进行某些操作之前,必须要确保前面步骤调用write()写入到文件的数据已经真实写入到了磁盘中,例如一些数据库的日志进程。
当我们在Ubuntu系统下拷贝文件到U盘时,文件拷贝完成之后,通常在拔掉U盘之前,需要执行sync命令进行同步操作,这个同步操作就是将文件I/O内核缓冲区中的数据更新到U盘硬件设备,如果没有执行,U盘中的文件可能还没来得及拷贝或没有完全拷贝。
int fsync(int fd);
系统调用fsync()将参数fd所指文件的内容数据和元数据写入磁盘,只有在对磁盘的写入操作完成之后,fsync()函数才会返回。
元数据是用于记录文件属性相关的数据信息,譬如文件大小、时间戳、权限等信息。
1K x 1K = 1M
系统调用sync()会将所有文件I/O内核缓冲区中的文件内容数据和元数据全部更新到磁盘设备中。
在Linux系统中,调用sync()函数仅在所有数据写入到磁盘设备之后才会返回;
调用open()函数时指定一些标志也会影响到文件I/O内核缓冲,譬如O_DSYNC和O_SYNC标志。
O_DSYNC标志类似于调用fdatasync()函数进行数据同步。
O_SYNC类似于fsync()
相关文章:
嵌入式面试总结
C语言中struct和union的区别 struct和union都是常见的复合结构。 结构体和联合体虽然都是由多个不同的数据类型成员组成的,但不同之处在于联合体中所有成员共用一块地址空间,即联合体只存放了一个被选中的成员,结构体中所有成员占用空间是累…...
超简单安装指定版本的clickhouse
超简单安装指定版本的clickhouse 命令执行shell脚本 idea连接 命令执行 参考官网 # 下载脚本 wget https://raw.githubusercontent.com/183461750/doc-record/d988dced891d70b23c153a3bbfecee67902a3757/middleware/data/clickhouse/clickhouse-install.sh # 执行安装脚本(中…...
FlowUs横向对比几款笔记应用的优势所在
FlowUs作为一个本土化的生产力工具,在中国市场的环境下相对于Notion有其独特的优势,尤其是在稳定性和模板适应性方面。 尽管Notion在笔记和生产力工具领域享有极高的声誉,拥有着诸多创新功能和强大的生态系统,但它并不一定适合每…...
收银系统源码-千呼新零售收银视频介绍
千呼新零售2.0系统是零售行业连锁店一体化收银系统,包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体,线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…...
从Catalog说到拜义父-《分析模式》漫谈11
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的Preface(前言)有这么一句: This book is thus a catalog, rather than a book to be read from cover to cover. 2004&am…...
Qt判定鼠标是否在该多边形的线条上
要判断鼠标是否在由QPainterPath或一系列QPointF点定义的多边形的线条上,你可以使用以下步骤: 获取鼠标当前位置:在鼠标事件中,使用QMouseEvent的pos()方法获取鼠标的当前位置。 检查点与线段的距离:遍历多边形的每条…...
【笔记:3D航路规划算法】一、随机搜索锚点(python实现,讲解思路)
目录 关键概念3D路径规划算法1. A*算法2. 快速随机锚点1. 初始化:2. 实例化搜索算法:3. 路径生成:4. 绘制图像: 3D路径规划是在三维空间中寻找从起点到终点的最短或最优路径的一种技术。它广泛应用于无人机导航、机器人运动规划、…...
ubuntu如何彻底卸载android studio?
最新版的ubuntu已经使用snap进行软件管理了,我用snap-store安装android studio以后,在安装plugin的时候强制退出后,直接再也进不去了,启动就报错。 先后进行了如下操作依然不行: 1 重装snap-store和android studio都…...
使用Windows Linux 子系统安装 Tensorflow,并使用GPU环境
在Microsoft Store商店安装Ubuntu 20.04 使用 nvidia-smi 命令查看GPU信息,查看支持的CUDA版本,这里最高支持11.7 安装cuda工具集 进入官网:CUDA Toolkit Archive | NVIDIA Developer,现在对应版本,点击 配置平台&…...
C++案例三:猜数字游戏
文章目录 介绍代码说明设置随机种子生成随机数猜测循环完整代码运行效果介绍 猜数字游戏是一个经典的编程练习,通过这个案例可以学习到基本的输入输出、随机数生成、条件判断和循环结构。 代码说明 设置随机种子 std::srand(static_cast<unsigned int>(std::time(nu…...
LNMP架构部署及应用
部署LNMP架构流程 1.安装Nginx(上传软件包,执行脚本) yum -y install pcre-devel zlib-devel gcc gcc useradd -M -s /sbin/nologin nginx tar zxf nginx-1.12.0.tar.gz cd nginx-1.12.0 ./configure --prefix/usr/local/nginx --usernginx…...
【医学影像】X86+FPGA:支持AI医学影像设备应用的工控主板,赋能CT、MRI、X线、超声等医学影像设备
支持AI医学影像设备应用的工控主板 在我国人口老龄化问题不断加剧,对影像诊断需求持续增长,和国家利好高端医学影像市场发展的系列法规和政策接连出台的大环境下,AI医学影像设备产业迎来发展黄金期。紧跟发展大势,基于12/13代 In…...
【PostgreSQL】PostgreSQL简史
博主介绍:✌全网粉丝20W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
Linux的热插拔UDEV机制和守护进程
目录 一、Linux的热插拔UDEV机制 二、守护进程 2.1 守护进程概念和基本特点: 2.2 显示进程信息: 2.3 守护进程和后台进程的区别: 2.4 创建守护进程的步骤和守护进程的特征: 2.4.1 创建守护进程的步骤: 2.4.2 守…...
laravel框架基础通识-新手
常用目录及其解析 routes 该目录为路由目录 一般根据api uri可以反向查找对应路由及其controller,目录下的文件名一般和url的第一级对应为了规范,然后根据根据里面具体分组和别名对应拼接对应路由url,后面对应的则是controller,…...
c++ extern 关键字
C中的extern关键字和跨语言互操作 变量的声明与定义 extern关键字用于声明在另一个翻译单元(文件)中定义的变量或函数。通过extern关键字,可以在多个文件中访问全局变量或函数。 变量声明示例 文件:main.cpp #include <io…...
Meta KDD Cup 2024 CRAG: Comphrehensive RAG Benchmark参赛指南(写了一半跑去改大论文了所以没正式参赛)
诸神缄默不语-个人CSDN博文目录 因为比赛过程正好和我毕业答辩的时间段高度重合,所以我……最后其实还是相当于没有成功参赛。 呃反正现在已经咕咕咕了,就把当时写了一半(一小半)的参赛指南发一下吧。 官网:AIcrowd …...
系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划(ERP)-解读
系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划(ERP) 3.7.1 企业资源规划的概念3.7.2 企业资源规划的结构3.7.2.1 生产预测3.7.2.2 销售管理(计划)3.7.2.3 经营计划(生产计划大纲)3.7.2.4 …...
windows实现自动化按键
1.选择目标窗口 获取窗口句柄 void KeyPresser::selectWindow() {SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, NULL, WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT);selectedWindowLabel->setText("请点击目标窗口..."); }void CALLBACK …...
阿里云 https证书部署
一.申请证书 二.查看状态 查看状态,已签发是完成了申请证书 三.部署 我在nginx服务器上部署 具体操作链接:阿里云文档 修改前 修改后 四.重启ngnix 五.验证是否成功 在浏览器输入域名查看...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
