当前位置: 首页 > news >正文

嵌入式面试总结

C语言中struct和union的区别

struct和union都是常见的复合结构。

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

在这里插入图片描述
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语言中内存分配的方式有几种?

  1. 静态存储区分配。
    内存分配在程序编译之前完成,且在程序的整个运行期间都存在,例如全局变量,静态变量等。
  2. 栈上分配。
    函数执行时,函数内的局部变量的存储单元在栈上创建,函数执行结束时这些存储单元自动释放。
  3. 堆上分配。
    由程序员手动分配和释放。

堆与栈有什么区别

  1. 申请方式
    栈的空间由操作系统自动分配/释放,堆上的空间手动分配/释放。
  2. 申请大小的限制
    栈空间有限,在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。栈顶地址和最大容量是系统预先设定好的,如果申请空间超过剩余栈空间时,将提示overflow,因此,能从栈获得的空间较小。
    堆是向高地址扩展的数据结构,是不连续的内存区域。由于系统是使用链表来存储空间内存地址的,堆的大小受限于计算机系统中有效的虚拟内存,因此,堆获得的空间比较灵活,也比较大。
  3. 申请效率
    栈是由系统自动分配,速度较快,但程序员无法控制。
    堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

栈的作用

  1. 用来存储临时变量,包括函数参数和函数内部定义的临时变量。函数的返回地址,寄存器均保存在栈中,函数返回后从栈中恢复寄存器的值。
  2. 每个线程都有自己的栈,用来存储本线程运行时各个函数的临时变量和维系函数调用和返回时的函数调用关系。

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系统中,可以用来查找可执行文件的是?

  1. whereis:搜索可执行文件、联机帮助文件、源代码文件。
  2. locate所有文件
  3. 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&#xff08;上传软件包&#xff0c;执行脚本&#xff09; 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医学影像设备应用的工控主板 在我国人口老龄化问题不断加剧&#xff0c;对影像诊断需求持续增长&#xff0c;和国家利好高端医学影像市场发展的系列法规和政策接连出台的大环境下&#xff0c;AI医学影像设备产业迎来发展黄金期。紧跟发展大势&#xff0c;基于12/13代 In…...

【PostgreSQL】PostgreSQL简史

博主介绍&#xff1a;✌全网粉丝20W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

Linux的热插拔UDEV机制和守护进程

目录 一、Linux的热插拔UDEV机制 二、守护进程 2.1 守护进程概念和基本特点&#xff1a; 2.2 显示进程信息&#xff1a; 2.3 守护进程和后台进程的区别&#xff1a; 2.4 创建守护进程的步骤和守护进程的特征&#xff1a; 2.4.1 创建守护进程的步骤&#xff1a; 2.4.2 守…...

laravel框架基础通识-新手

常用目录及其解析 routes 该目录为路由目录 一般根据api uri可以反向查找对应路由及其controller&#xff0c;目录下的文件名一般和url的第一级对应为了规范&#xff0c;然后根据根据里面具体分组和别名对应拼接对应路由url&#xff0c;后面对应的则是controller&#xff0c…...

c++ extern 关键字

C中的extern关键字和跨语言互操作 变量的声明与定义 extern关键字用于声明在另一个翻译单元&#xff08;文件&#xff09;中定义的变量或函数。通过extern关键字&#xff0c;可以在多个文件中访问全局变量或函数。 变量声明示例 文件&#xff1a;main.cpp #include <io…...

Meta KDD Cup 2024 CRAG: Comphrehensive RAG Benchmark参赛指南(写了一半跑去改大论文了所以没正式参赛)

诸神缄默不语-个人CSDN博文目录 因为比赛过程正好和我毕业答辩的时间段高度重合&#xff0c;所以我……最后其实还是相当于没有成功参赛。 呃反正现在已经咕咕咕了&#xff0c;就把当时写了一半&#xff08;一小半&#xff09;的参赛指南发一下吧。 官网&#xff1a;AIcrowd …...

系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划(ERP)-解读

系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划&#xff08;ERP&#xff09; 3.7.1 企业资源规划的概念3.7.2 企业资源规划的结构3.7.2.1 生产预测3.7.2.2 销售管理&#xff08;计划&#xff09;3.7.2.3 经营计划&#xff08;生产计划大纲&#xff09;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证书部署

一.申请证书 二.查看状态 查看状态&#xff0c;已签发是完成了申请证书 三.部署 我在nginx服务器上部署 具体操作链接:阿里云文档 修改前 修改后 四.重启ngnix 五.验证是否成功 在浏览器输入域名查看...

DX-10A信号继电器 柜内安装,板前接线 约瑟JOSEF

DX-10型闪光信号继电器型号&#xff1a; DX-10A闪光信号继电器&#xff1b; DX-10B闪光信号继电器&#xff1b; DX-10C闪光信号继电器; 用途 DX-10 闪光继电器用于电力系统断路器的位置信号灯不对应闪光&#xff0c;该继电器是为了适应当前推广使用发光二极管节能指示灯而…...

芯片光刻后的晶片多层组合构成的吗

是的&#xff0c;芯片&#xff08;尤其是集成电路芯片&#xff09;确实是通过光刻后的晶片多层组合构成的。在芯片制造过程中&#xff0c;光刻是一个至关重要的步骤&#xff0c;用于在硅片&#xff08;或称为晶片&#xff09;上刻画出精确的电路图案。然而&#xff0c;一个完整…...

OpenGL-ES 学习(7) ---- VBO EBO 和 VAO

目录 VBO(Vertex Buffer Object)EBO(Element Buffer Object)VAO(Vertex Array Object) VBO(Vertex Buffer Object) EBO(Element Buffer Object) VBO(Vertex Buffer Object) 实际是指顶点缓冲器对象 在 opengl-es 2.0 的编程中&#xff0c;用于绘制图元的顶点数据是从 CPU 传…...

github如何实现和gitlab的同步

要实现 GitHub 和 GitLab 之间的同步&#xff0c;你可以使用以下几种方法。这里介绍两种常用的方法&#xff1a;使用 GitLab CI/CD 和使用镜像仓库。 方法1&#xff1a;使用 GitLab CI/CD 通过 GitLab CI/CD&#xff0c;可以在每次推送到 GitLab 时自动同步到 GitHub。以下是…...

内网隧道——隧道技术基础

文章目录 一、正向连接与反向连接1.1 正向连接1.2 反向连接 二、端口转发三、端口映射四、端口复用五、代理和隧道的区别六、常见隧道穿透分类 环境&#xff1a; kali&#xff1a;192.168.92.6&#xff0c;MSF v6.3.25 win7&#xff1a;192.168.92.7 一、正向连接与反向连接 1…...

NAS新品“翻车”后,绿联科技要上市了

在消费电子市场回暖的东风中&#xff0c;又一消费电子知名企业登陆A股。 近日&#xff0c;深圳市绿联科技股份有限公司&#xff08;下称“绿联科技”&#xff09;开启申购&#xff0c;将在创业板上市。本次上市&#xff0c;绿联科技的发行价为21.21元/股&#xff0c;发行数量为…...

kafka-client如何打印连接日志

在Kafka客户端中打印连接日志&#xff0c;通常涉及配置日志框架来捕获和输出Kafka客户端在建立连接过程中的相关信息。由于Kafka客户端使用SLF4J&#xff08;Simple Logging Facade for Java&#xff09;作为日志门面&#xff0c;实际的日志实现&#xff08;如Log4j2、Logback等…...

1、springboot3 vue3开发平台-后端-项目构建

文章目录 1. 创建项目1.1 前置环境条件1.2 项目创建 2. 模块配置2.1 父工程配置概述2.2 配置启动模块2.3 父工程相关依赖管理 1. 创建项目 1.1 前置环境条件 idea2023, jdk17 1.2 项目创建 创建父工程并删除不需要的文件目录&#xff1a; 右键父工程依次创建其他模块 最…...

修改了mybatis的xml中的sql不重启服务器如何动态加载更新

目录 一、背景 二、注意 三、代码 四、使用示例 五、其他参考博客 一、背景 开发一个报表功能&#xff0c;好几百行sql&#xff0c;每次修改完想自测下都要重启服务器&#xff0c;启动一次服务器就要3分钟&#xff0c;重启10次就要半小时&#xff0c;耗不起时间呀。于是在…...

Intel和AMD用户再等等!微软确认Win11 24H2年底前登陆

微软近日确认&#xff0c;Windows 11 24H2版本将于2024年底前正式登陆使用英特尔和AMD处理器的PC。 根据微软介绍&#xff0c;Windows 11 24H2将作为传统功能更新&#xff0c;将在今年晚些时候提供给所有设备。 此前&#xff0c;微软已向搭载骁龙X Plus和X Elite系列处理器的Co…...

做一建真题的网站/seo相关岗位

2019独角兽企业重金招聘Python工程师标准>>> btn.layer.anchorPoint CGPointMake(0.5, 1); 转载于:https://my.oschina.net/gongxiao/blog/503793...

中国建设委员会官方网站/360网站收录

关注“潜在价值”&#xff0c;最好的技术商业媒体&#xff0c;了解那些智慧商业 本文由潜在价值旗下 创意产品推荐平台“钛空舱”推出 钛空&#xff08;ID&#xff1a;TiKong-life&#xff09; 一个关注于科技与创意生活的选品、荐品平台 新奇、实用、品质保证 一切关于未来生活…...

web开发工具下载/佛山网站优化

关注头条号&#xff0c;私信回复资料会有意外惊喜呦………………最后一张照片有资料。不管是参加Kaggle比赛&#xff0c;还是开发一个深度学习应用&#xff0c;第一步总是数据分析。这篇文章介绍了8个使用Python进行数据分析的方法&#xff0c;不仅能够提升运行效率&#xff0c…...

公司的网站如何进行修改布局/南宁seo费用服务

AngularJS的四大特性的思维导图如下: 将AngularJS应用于工作&#xff1a;其思维导图如下&#xff1a; AngularJS服务思维导图: 转载于:https://www.cnblogs.com/PHM64123/p/7660985.html...

网站开发给网站设置图标在什么文件中写代码/nba最新交易新闻

需要实现的效果如图&#xff0c;当光标停留在System上时出现文档说明&#xff0c;以下jdk1.8举例 实现&#xff1a; 1、先下载一个jdk api 1.8_google.CHM文件 2、cmd中执行命令 先进入该目录下&#xff0c;然后执行下面命令&#xff0c;其中html1.8文档可以自定义&#xff0…...

两个电脑的wordpress/免费的推文制作网站

导读&#xff1a;拖拖拉拉&#xff0c;机房的合作也算是接近了尾声了。在这个过程中&#xff0c;真心是感谢我的两个组员。这个机房合作&#xff0c;看似简单&#xff0c;但我的组员给我的帮助和感动&#xff0c;都是不可忽略的。记得刚开始的时候&#xff0c;我就说过&#xf…...