【面试】嵌入式C语言题目整理

2023-05-16

【面试】嵌入式C语言题目整理


在这里插入图片描述

  1. 描述内存四区。

内存四区分为:代码区、静态区、堆区、栈区
代码区就是用来存放代码的。
静态区用来存放全局变量、静态变量、常量(字符串常量、const修饰的全局变量)。
堆区中的内存是由程序员自己申请和释放的,用malloc函数去申请,用free释放内存。
栈区中的内存是由编译器自动申请和释放的,用来存放函数返回值、函数参数、局部变量等。

  1. new和malloc的区别

new和malloc都是用于动态的内存分配。
new是适用于C++申请内存分配,malloc在C和C++中都适用。
new自动计算分配内存大小,malloc需要手动计算内存大小,并以参数形态传入。也就是所new是根据类型申请的空间,malloc是根据输入的大小计算的内存空间。
new返回值是申请类型的指针,malloc返回类型是void*,需要强制转换。

  1. 数组与指针的区别

类型不同:数组是一种复合类型,它是由相同数据类型的元素组成的序列;指针是一种基本类型,它是一个指向某种类型地址的变量。
大小不同:如果用sizeof去求解占用内存大小的话,数组是全部元素实际占用的内存大小;而指针占用内存的大小与其指向类型无关,是固定的,例如在32位平台下,是固定的4字节。
内存布局不同:数组是一段连续的内存地址空间,而指针是指向某个存储位置的变量。
访问方式不同:数组可以通过下标来访问其中的元素,数组名可以当作指针使用,通过加加减减以及解引用的方式访问元素。

  1. 野指针

定义的指针未初始化;
释放地址后的指针,未重新执行新的地址或者NULL;
指针运算过程中越界;

  1. static关键字

静态局部变量:只有当该变量所在的函数第一次被调用的时候,静态局部变量才会被初始化;当以后在进入该函数时,该变量不会再被初始化,仍旧保留上一次退出该函数时的值。
静态全局变量:只能被初始化一次,并且该变量的作用域只能是当前c文件。
静态函数:该函数只能被当前c文件调用,不可以被其他文件调用。

  1. gcc的编译过程

预处理、编译、汇编、链接

  1. 指针常量与常量指针

指针常量:int* const a; 该指针变量是不能变的,即存储的地址是不能变的,但是该地址指向的值是可以变化的。
常量指针:const int* a; 该指针变量是可以变化的,即存储的地址是可以变化的,但是地址指向的值是不能变化的。也就是说当a指向了一个地址之后,该地址中的值是不能通过a来改变的。

  1. #include<> 与#include ""的区别?

#include<>会去系统指定目录查找头文件。
#include ""会先在项目目录中查找头文件,如果没有的话,再去系统指定目录中查找。

  1. #define与typedef的区别

#define是预处理中的宏定义命令,在预处理阶段进行简单的字符替换,并不进行正确性检查。
typedef是关键字,常用于替换复杂类型声明定义的简单别名,在编译阶段是进行正确性检查的。
#define不需要;结尾,typedef需要;结尾
对指针的控制不同,如下:
在这里插入图片描述
这种定义方式,t和tt都是int*类型,而d和a是int*,dd和aa是int。

  1. ifndef/define/endif的作用

避免头文件被重复引用

  1. extern关键字

c语言在定义变量或者函数的时候,默认是前面加了extern关键字。
表明该变量或者函数能够被其他文件所使用。

其他文件在使用的时候,需要用extern来声明所使用的变量或函数,表示该变量或函数需要去其他文件中查找。

  1. volatile关键字

volatile是c语言的关键字,作用是防止编译器被优化。
编译器优化的意思是,因为cpu的执行速度比内存的读取速度要快的多,某些变量可能会被存放在寄存器中,当cpu需要读取该变量时,就直接从寄存器读取(而不是去该变量的实际内存地址读取),提升了程序运行速度。
假如某个函数将该变量的值改变了,但是并未触发寄存器更新,那么cpu读取出来的值与实际值就会发生不一致。
所以需要vloatile关键字修饰变量,禁止编译器对其进行优化。
比如说:
中断服务程序中修改的供其它程序检测的变量需要加volatile。
被多个线程共享的变量需要加volatile。

  1. sizeof和strlen的区别

sizeof是关键字;strlen是函数
sizeof可以计算任何类型的实际内存占用大小;strlen只能计算字符串的实际长度。
sizeof是在编译时计算大小的;strlen是在运行期确定字符串长度的。

  1. 字节对齐

C语言结构体字节对其规则简述

  1. 结构体与联合体的区别

结构体中的每一个成员的内存都是独立的,对某个成员赋值,并不会影响其他成员的内容。
联合体(共用体)中的成员间的内存是共用的,对某个成员赋值,会破坏掉其他成员的值,也就是说在同一时间,只能有一个成员的值是有效的。
再说一下,注意事项:①无论是结构体还是共用体,计算占用内存大小时,都需要考虑字节对齐规则;②讲解一下共用体在自己项目中的应用。

  1. 短路求值问题

if( (语句1) || (语句2) ) 假如语句1已经判断为真了,那么if肯定为真,语句2就不会再执行了;
if( (语句1) && (语句2) ) 假如语句1已经判断为假了,那么if肯定为假,语句2就不会再执行了;

  1. 指针数组与数组指针

指针数组:定义方式:int *p[5];表示该数组中的每一个元素都是指针类型。
数组指针:定义方式:int (*p)[5];表示该指针指向了一个长度为5的int类型的数组。例如二维数组的每一行,可以用数组指针来表示。

  1. 一维数组的数组名a、二维数组的数组名b的含义

一维数组的数组名表示第一个元素的地址,即a、a+1、a+n表示第1,2,…,n的元素地址。
对一维数组的数组名取地址,表示的是该数组的数组指针。
二维数组的数组名表示第一行数组的数组指针,即b、b+1、b+n、表示第1,2,…,n行数组的数组指针。

	int array[3] = { 1,2,3 };

	int(*p)[3]=NULL; //数组指针
	int* d=NULL;    //整型指针

	p = &array;   //取数组的地址
	d = array;   //第一个元素的地址
	
	printf("%d",*(*p+1));
	printf("%d",*(d+1));
	int a[2][3] = { {1,1,1},
	                {2,2,2}};

	int(*p)[3]=NULL; //数组指针

	p = a;      //p此时为第一行数组的数组指针
	p = a + 1;  //p此时为第二行数组的数组指针
	
	printf("%d",*(*p+1));
  1. 不使用第三个变量,交换两个变量的值
	int a = 3, b = 5;

	a = a + b;
	b = a - b;
	a = a - b;

	printf("%d,%d\r\n",a,b);

	a = a ^ b;
	b = a ^ b;
	a = a ^ b;

	printf("%d,%d\r\n", a, b);
  1. 求1000以内的质数(素数)

除了1和它本身以外,不再有其他的因数。

int main()
{
	//打印出1000以内的质数
	int temp = 1;
	int count = 0;
	int flag = 0;

	while ((temp++) < 1000)
	{
		flag = 0;
		for (int i = 2; i <= temp / 2; i++)
		{
			if (temp % i == 0)
			{
				flag = 1;
				break;
			}
		}

		if (flag == 0)
		{
			printf("%d\r\n", temp);
			count++;
		}
	}

	printf("一个有%d个质数\r\n",count);
}
  1. 冒泡算法
void swap(int *a,int *b)
{
	*a = *a + *b;
	*b = *a - *b;
	*a = *a - *b;
}

void sort(int* temp,int length)
{
	for (int i = 0; i < length-1;i++)
	{
		for (int j=0;j<length-1-i;j++)
		{
			if (*(temp + j) > *(temp + j + 1))
			{
				swap(temp + j, temp + j + 1);
			}
		}
	}
}
  1. 描述浅拷贝与深拷贝

当结构体中有指针存时,浅拷贝仅仅是将指针变量的值拷贝过来,而深拷贝是将指针指向地址中的值重新拷贝到另一个地址中,并指向。
比如:
例如结构体A中有指针int *p,指向了int x = 5。
浅拷贝到结构体B,那么B中的指针int *p存放的也是x的地址。
深拷贝到结构体C,会重新的找一个int类型的地址,将5这个值放进去,然后再用结构体C中的int *p指向它。
对于浅拷贝,假如A中p指向的x变为了6,那么B中的p指向的值也就变为了6。
对于深拷贝,假如A中p指向的x变为了6,而C中p指向的地址不再是x,所以C中p指向的值仍旧是5。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【面试】嵌入式C语言题目整理 的相关文章

  • 交流电路红的视在功率VA数值上是电压与电流的乘积等于有功功率的平方加上无功功率的平方,再开平方。无功功率将电感或电容元件与交流电源往复交换的功率。虽然无功元件整体做功是0.吸收和释放相等

    一 有功功率 在交流电路中 xff0c 凡是消耗在电阻元件上 功率不可逆转换的那部分功率 xff08 如转变为热能 光能或机械能 xff09 称为有功功率 xff0c 简称 有功 xff0c 用 P 表示 xff0c 单位是瓦 xff08
  • 软件破解注册码

    写在破解之前 xff1a xff1a xff1a 软件破解的目的是 xff1a 有些需要注册的软件 xff0c 可是找不到注册码 xff0c 将其破解之后 xff0c 输入任何注册码都会提示注册成功 声明 xff1a 此贴适合从来没接触过软
  • keil中怎么添加自己的头文件,加入工程,保存路径。#include还用吗

    keil中怎么添加自己的头文件 xff0c 例如 xff1a 添加 include lt led h gt 要把它写在哪里 xff0c 保存在哪里 xff0c 才能编译后 xff0c 显示 include lt reg51 h gt inc
  • 面试题整理简历中深度学习机器学习相关的知识及linux操作系统命令

    深度学习与机器学习 都在整理关于后台的 xff0c 被问到后忘了 xff0c 尴尬 的确是我的问题 xff0c 基本的机器学习知识还是要整理一波 o inception 网络 xff1a 主要应用了深度可分离卷积 xff1a 主要用了大尺度
  • 面试可能遇到的问题野指针等解决方法

    空指针 xff1a 一般声明一个指针变量赋值为NULL xff0c 这就是空指针 xff0c 各个类型的空指针都存在确确实实的内存地址 xff0c 但是不会指向任何有效的值的内存地址 xff0c 对空指针操作 xff0c 例如访问属性和方法
  • 大规模分布式储存系统笔记(一)

    分布式储存系统的特性 xff1a 1 可扩展性 可按集群规模增长 xff0c 系统性能线性增长 xff1b 2 低成本 系统自动容错 xff0c 自动负载均衡 xff0c 运维方便 3 高性能 4 易用性 对外提供接口 数据类型 xff1a
  • 用MATLAB实现对运动物体识别与跟踪

    不得不说MATLAB的图像处理函数有点多 xff0c 但速度有时也是出奇的慢 还是想c的指针 xff0c 虽然有点危险 xff0c 但速度那是杠杠的 第二个MATLAB程序 xff0c 对运动物体的识别与追踪 这里我们主要运用帧差法实现运动
  • PS 开启GPU加速图片处理

    还认为你的电脑的速度效果比不上苹果吗 xff1f 还在嫌电脑渲染速度慢吗 xff1f 试一下 xff0c 电脑开启GPU硬件加速吧 xff01 只要有独显轻松加速 xff08 毕竟苹果笔记本要配独显电脑的价格基本上在15000以上 xff0
  • 管道鸟cortex-M4(TM4C1294)

    看到满屏的贪吃蛇 xff0c 我也来开源一个Ti开发板 xff08 TM4C1294 xff09 的游戏 将简化版的管道鸟 xff0c 根据自己玩的经历 xff0c 在cortexm4开发板上重新撸了一边 xff0c 设计思路 xff1a
  • C#连接MYSQL数据库并进行查询

    之前用MFC开发结果界面太难看被pass了 要求用C 重新来开发 gt lt 不过终于摆脱VC6 0的蛋疼操作了Y 先来连接数据库 xff08 1 xff09 用c 连接MYSQL数据库需要用到mysql connector net xff
  • binascii.Error: Incorrect padding 报错解决

    输入的base64编码字符串必须符合base64的padding规则 当原数据长度不是3的整数倍时 如果最后剩下两个输入数据 xff0c 在编码结果后加1个 61 xff1b 如果最后剩下一个输入数据 xff0c 编码结果后加2个 61 x
  • 通过过滤器链了解spring security + oauth2实现单点登录的过程

    一 系统 注意部署在同一机器 xff08 localhost xff09 上的三个应用 xff0c 为了防止存放在cookie中的JSESSIONID不被覆盖 xff0c 需要设置不同的path xff0c 可以在配置文件中指定不同的上下文
  • jetson tx2开箱上电

    期待已久的jetson tx2终于到了 xff0c 来做一个开箱 jetson tx2是英伟达的第三代GPU嵌入式开发板 前两代分别是jetson tk1和jetson tx1 jetson tk1 xff1a 绿色的版板子接口丰富 jet
  • Jetson tx2刷机过程中的坑

    暑假各种事忙得差不多后 xff0c 终于有时间拿出早就申请到的tx2 xff0c 开始刷机教程 xff0c 这两天几乎踩边了所有的坑 第一个坑 xff0c 虚拟机 一般在安装VMware虚拟机时 xff0c 建议的安装空间20GB xff0
  • python词云实现

    python的一个蛮酷炫的功能是可以轻松地实现词云 github上有关于这个项目的开源代码 xff1a https github com amueller word cloud 注意跑例程时要删除里面的wordcloud文件夹 词云的功能有
  • docker中accessTokens拉取私有git仓库

    背景 当需要git clone拉取私有库时 xff0c 传统的做法为将本机的ssh配置到gitlab中 但在docker中执行程序时需要拉取私有库 xff0c 此时无法为每个docker容器配置ssh 网上的一种方案为 xff0c 将配置好
  • Docker世界 -- 进阶篇(入门)

    一 Docker Compose 1 1 Docker Compose 介绍 1 1 1 简介 xff1a 传统的 docker 服务 xff0c 我们一般通过编写 Dockerfile 文件 xff0c 通过 build 命令创建一个镜像
  • 树莓派pico CMake工程 直接添加 .c .h文件

    假设工程名test1 xff0c 带main 的源代码文件 main c xff0c 要往工程里添加oled c oled h之类的源代码 直接添加为可执行文件 xff1a 编辑工程根目录的 CmakeLists txt add execu
  • 张量的通俗理解

    1 关于张量的四种定义 张量 在不同的运用场景下有不同的定义 xff08 1 xff09 张量是多维数组 xff0c 这个定义常见于各种人工智能软件 听起来还好理解 xff08 2 xff09 张量是某种几何对象 xff0c 不会随着坐标系
  • 如何搭建node_exporter

    如何搭建node exporter 1 观看条件 1 假设你已经看过上一篇文章 如何搭建普罗米修斯 Prometheus 2 假设你已经会搭建普罗米修斯 xff08 promethus xff09 3 上面两个假设 xff0c 只要满足一个

随机推荐

  • python类中初始化形式:def __init__(self)和def __init__(self, 参数1,参数2,···,参数n)区别

    前言 这两种初始化形式 xff0c 就类似于C 43 43 类中的构造函数 形式1 def init self span class token keyword class span span class token class name
  • Go语言操作grpc详细使用

    Go语言操作grpc详细使用 零 参考链接一 protobuf的详细使用二 grpc与protobuf的go文件的生成1 安装两个插件2 写proto文件3 编译proto文件 xff0c 生成go文件 三 grpc的详细使用1 一元RPC
  • Steghide使用教程及其密码爆破

    Steghide使用教程及其密码爆破 工具介绍 Steghide是一款开源的隐写术软件 xff0c 它可以让你在一张图片或者音频文件中隐藏你的秘密信息 xff0c 而且你不会注意到图片或音频文件发生了任何的改变 而且 xff0c 你的秘密文
  • 一道Gloang并发、锁的面试题,你会吗?

    Gloang并发 锁的面试题 1 题目描述2 问题分析2 1问题一2 2问题二2 3问题三2 4问题四2 5问题五 3 问题解决方法4 代码实现4 1 map前后加锁的方式4 2 sync map解决方式 1 题目描述 源地址 xff1a
  • 阿里云、腾讯云centos7安装mysql

    阿里云 腾讯云centos7安装mysql 1 下载2 解压与准备3 安装4 配置4 1配置数据库4 2查看默认密码4 3启动mysql4 4设置密码 5 开启远程登录5 1开放3306端口5 2开启远程登录6 参考链接 1 下载 镜像网站
  • go语言gin、net/http的优雅关机

    gin net http的优雅关机 什么是优雅关机 xff1f 优雅关机的实现参考链接 什么是优雅关机 xff1f http server运行过程中 xff0c 若进程被关闭 xff0c 那么正在处理的请求可能只被处理了一半就停止了 xff
  • C语言不详细记录

    C记录 1 内存管理2 结构体内存对其规则3 字符串函数4 二维数组5 const 指针6 字符串7 图片记录8 函数指针 1 内存管理 C语言内存讲解 详说内存分布和heap空间 2 结构体内存对其规则 C语言结构体对齐规则 C语言 结构
  • 【web压测】压测常用工具、压测指标到底是什么?

    压测常用工具 压测指标到底是什么 xff1f 一 压测指标 I1 QPS xff0c 每秒查询2 TPS xff0c 每秒事务3 RT xff0c 响应时间 二 压测指标 II三 压测工具1 ab2 go wrk 在window上压测 一
  • C语言结构体字节对其规则简述

    C语言结构体字节对其规则简述 规则描述示例示例一示例二 字节对齐规则 xff0c 一直不是很理解 xff0c 网上的答案也是参差不齐 规则描述 首先 xff0c 预处理指令 pragma pack n 可以改变默认对齐数进行字节对齐 n 取
  • 【STM32学习】SysTick定时器(嘀嗒定时器)

    SysTick定时器 一 参考资料二 时钟源选择与定时时间计算1 时钟源选择2 定时时间计算 三 SysTick Handler中断服务函数 一 参考资料 嘀嗒定时器 xff1a 时钟源 寄存器 二 时钟源选择与定时时间计算 结合正点原子的
  • 【STM32学习】GPIO口的八种工作模式

    GPIO口的八种工作模式 一 参考资料二 GPIO八种模式1 输入模式2 输出模式 三 施密特触发器1 电路2 电路计算 一 参考资料 GPIO原理图详解 强烈建议观看 xff1a GPIO为什么这样设计 xff1f 施密特触发器 原理 施
  • 【STM32学习】WWDG窗口看门狗

    STM32学习 WWDG窗口看门狗 x1f415 1 图展示WWDG原理2 复位 中断条件3 溢出时间计算4 与独立看门狗 x1f415 的对比 1 图展示WWDG原理 2 复位 中断条件 产生复位的情况 xff1a 当递减计数器数值递减到
  • 【STM32学习】时钟配置详解

    STM32学习 时钟配置详解 看懂时钟图结合代码外部高速时钟修改 看懂时钟图 在刚开始学习32的时候 xff0c 并不会在意这些 xff0c 或者即使看了也看的不是很明白 随着学习的深入 xff0c 我们发现看门狗 定时器 ADC很多外设都
  • vnc远程访问ubuntu18.04桌面系统 vncserver开机自启动

    文章目录 一 windows端准备二 ubuntu端准备三 远程连接桌面四 配置vncserver开机自启动 一 windows端准备 下载TightVNC xff1a https www tightvnc com 二 ubuntu端准备
  • 【STM32学习】定时器寄存器配置、功能工作过程详解

    STM32学习 定时器寄存器配置 功能工作过程详解 零 参考一 引言二 功能以及寄存器说明1 最基本的定时功能 xff08 时基单元 xff09 1 1 框图1 2 工作流程1 3 寄存器介绍1 3 1 CR1寄存器1 3 2 CNT PS
  • 【STM32学习】实时时钟 —— RTC

    STM32学习 实时时钟 RTC 零 参考一 工作原理1 RTC介绍2 工作过程 二 相关寄存器三 代码说明1 rtc初始化2 关于中断3 中断配置代码 xff08 仅供参考 xff09 3 1 秒中断 43 普通闹钟功能3 2 待机模式唤
  • 【JLink仿真器】盗版检测、连接故障、检测不到芯片问题

    JLink仿真器 盗版检测 连接故障 检测不到芯片问题 一 问题描述二 解决方法1 降低驱动 xff08 解决非法问题以及连接故障 xff09 2 SWD引脚被锁 xff08 解决检测不到芯片 xff09 三 说明 一 问题描述 盗版检测
  • 【STM32学习】直接存储器访问——DMA

    STM32学习 直接存储器访问 DMA 零 参考一 对DMA的理解二 DMA通道优先级三 DMA通道x传输数量寄存器 DMA CNDTRx 四 DMA缓冲区设计 零 参考 一个严谨的STM32串口DMA发送 amp 接收 xff08 1 5
  • 【STM32学习】模数转换器——ADC

    STM32学习 模数转换器 ADC 零 参考一 ADC转换耗时二 转换模式三 对某些寄存器的理解1 ADC CR22 ADC SQRX 四 库函数注意事项 零 参考 STM32固件库 xff08 标准外设库 xff09 入门学习 第七章 A
  • 【面试】嵌入式C语言题目整理

    面试 嵌入式C语言题目整理 描述内存四区 内存四区分为 xff1a 代码区 静态区 堆区 栈区 代码区就是用来存放代码的 静态区用来存放全局变量 静态变量 常量 xff08 字符串常量 const修饰的全局变量 xff09 堆区中的内存是由