嵌入式C语言——常见面试题

article/2025/8/22 19:18:44

1、描述一下gcc编译过程?

gcc编译过程分为4步骤:预处理、编译、汇编、链接。

  • 预处理:头文件包含、宏替换、条件编译、删除注释。
  • 编译:主要进行词法、语法、语义分析等等,检查无误后把预处理好的文件编译成汇编文件。
  • 汇编:汇编文件转换为二进制目标文件。
  • 链接:把项目中的各个二进制文件 + 所需的库 + 启动代码链接为可执行文件。

2、内存最小存储单位以及内存的最小计量单位分别是?

内存的最小存储单位是二进制位,内存的最小计量单位:字节

3、#include<> 和#include""差异?

include<>到系统指定目录寻找头文件,#include ""先到项目所在目录寻找头文件,如果没有找再到系 统指定的目录下寻找。

4、描述一下变量的命名规则?

变量名可以由字母、数值、下划线构成,但不能直接以数值开头。

5、变量的声明和定义?

声明变量不需要建立存储空间,变量的定义需要建立一个存储空间。

6、谈谈C语言的有符号和无符号的差异?

  • 有符号:数据的最高位表示符号位,0代表正数,1代表着负数。
  • 无符号:数据的最高位不是符号位,而是数据整体的一部分。

7、谈谈计算机补码意义?

  • 统一了0的编码。
  • 把符号位和其他位统一处理。
  • 把减法运算转换为加法运算

8、谈谈数组特征?

同一个数组的成员都是相同的数据类型,同时所有的成员在内存中的地址也都是连续的。

注意:数组是存放在连续内存空间上的相同类型数据的集合。

  • 数组下标都是从0开始。
  • 数组内存空间地址都是连续。

在这里插入图片描述

9、数组分类

  • 静态数组:类似int arr[5];在程序运行就确定了数组的大小,运行过程无法改变数组的大小。
  • 动态数组:主要是在堆区申请的内存空间,数组的大小还是在程序运行中确定的,可以更改数组的大小。

10、描述一维数组的不初始化、部分初始化、完全初始化的不同特点?

  • 不初始化:若是一个局部数组,则数组元素内容随机,若是全局数组,则数组元素内容为0.
  • 部分初始化:没有初始化的部分自动补零。
  • 完全初始化:若一个数组全部初始化,则省略元素个数的数组大小由初始化的个数确定。

11、谈谈数组名作为类型、作为地址、对数组名取地址的区别?

  • 数组名作为类型:代表着整个数组的大小。
  • 数组名作为地址:代表着数组首元素的地址。
  • 数组名取地址:代表数组的首地址。

12、谈谈你对二维数组在物理上以及逻辑上的数组维度理解?

二维数组逻辑上是二维的,物理上是一维的。

13、描述一下函数定义和函数声明的差异?

  • 函数定义:对函数功能确定、指定函数名称,函数类型,形参及其类型,函数体等等,都是一个完整的,独立的函数单位。
  • 函数声明:函数名字、函数类型和形参个数、类型和顺序告知编译器,便于在包含函数调用的语句进行编译时,据此对其进行对照验证检查。

14、描述一下指针和指针变量的差异?

指针:内存中的每一个字节都会分配一个32位或者64位的编号,这个编号就是地址,而指针就是内存单元的编号。
指针变量:本质就是变量,只是该变量存放的是空间的地址编号。

15、描述一下32位或者64位平台下的指针大小

  • 32位平台:任意类型的指针大小是4字节。
  • 64位平台:任意类型的指针大小都是8字节。

16、描述一下指针数组概念?

指针数组本质就是数组,只不过数组的每一个元素存储的都是一个指针(地址)

17、描述一下普通局部变量、普通全局变量、静态局部变量、静态全局变量的差异?

  • 普通局部变量:存放在栈区,若不初始化内容则随机值,只会在定义的语句块内有效,语句块结束之后变量空间就会被释放掉弹出。
  • 普通全局变量:存放在内存全局区,若不初始化内容则默认0,进程结束空间才会被释放,能够被当前源文件或者其他文件使用;

注意:其他文件调用该全局变量,需要使用extern修饰。

  • 静态局部变量:存放在全局区,不被初始化内容则默认0,整个进程结束空间才会被释放,只能够在定义的语句块内有效。
  • 静态全局变量:存放在内存全局区,不初始化则默认0,整个进程结束空间会被释放,只能够被当前源文件使用。

18、描述一下内存分区?

  • 程序运行之前:分为代码区、BSS段(未初始化数据区)、data段(初始化数据区)。
  • 程序运行之后:栈、堆、全局区(静态区)、文字常量区、代码区。
    在这里插入图片描述

19、使用realloc给已分配的堆区空间追加空间时需要注意什么?

注意:需要使用指针变量保存realloc的返回值。

20、谈谈文件的分类?

  • 二进制文件基于数值编码,需要根据具体应用解析。
  • 文本文件基于字符集编码,一个字节一个意思,可以直接通过记事本打开。

21、文件缓冲区刷新有几种刷新模式?

行刷新、满刷新、强制刷新、关闭刷新。

22、如何理解结构体的深拷贝和浅拷贝?

若结构体有指针成员的时候容易出现该问题。

浅拷贝:两个结构体变量的指针成员指向了同一个堆区空间,在各个结构体变量释放的时候会出现多次释放同一段堆区空间的情况。

深拷贝:让两个结构体变量的指针成员分别指向了不同的堆区空间,只是空间内容拷贝一份,这样在各个结构体变量释放的时候就不会出现多次释放同一段堆区空间的问题。

23、描述一下结构体对齐规则?

  1. 结构体成员对齐规则。第一个结构体成员应该放在offffset(偏移量)为0的地方,以后每个数组成员应该放在offffset 为min(当前成员的大小,#pargama pack(n))整数倍的地方开始(比如int在32位机器为4字节,#pargama pack(2),那么从2的倍数地方开始存储)。

  2. 结构体总的大小,也就是sizeof的结果,必须是min(结构体内部最大成员,#pargama pack(n))的整数倍,不足要补⻬。

  3. 结构体做为成员的对齐规则。如果一个结构体B里嵌套另⼀个结构体A,还是以最大成员类型的大小对齐,但是结构体A的起点为A内部最大成员的整数倍的地方。(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。),结构体A中的成员的对齐规则仍满足原则1、原则2。


http://chatgpt.dhexx.cn/article/YpCHpI1l.shtml

相关文章

c语言对嵌入式的作用是什么,关于嵌入式C语言它有些什么意义

描述 首先&#xff0c;在当前产业结构升级的大背景下&#xff0c;机械行业未来的自动化、智能化程度会越来越高&#xff0c;所以机械类相关专业的知识结构必然会不断得到丰富和发展&#xff0c;而学习编程语言对于机械类专业来说具有较为实际的意义&#xff0c;尤其是C语言。 机…

总结嵌入式C语言难点(2部分)

结构类型和对齐 C语言提供自定义数据类型来描述一类具有相同特征点的事务&#xff0c;主要支持的有结构体&#xff0c;枚举和联合体。其中枚举通过别名限制数据的访问&#xff0c;可以让数据更直观&#xff0c;易读&#xff0c;实现如下&#xff1a; 联合体的是能在同一个存储…

嵌入式c语言教程 题库 百度云,嵌入式c语言视频教程尚观主讲视频教程

嵌入式C语言培训-01C语言概述-01C语言概念-发展历史-特点.mp4 嵌入式C语言培训-01C语言概述-02C基本程序结构-第一个helloworld程序-Linux下编辑编译执行.mp4 嵌入式C语言培训-01C语言概述-03C语言第2个程序第3个程序.mp4 嵌入式C语言培训-01C语言概述-04C程序开发过程.mp4 嵌入…

《嵌入式C语言》C语言介绍及环境搭建

--最具价值的嵌入式C语言1 C语言简介 C语言是国际上广泛流行的高级语言&#xff0c;是在B语言的基础上发展起来的&#xff0c; 1970年&#xff0c; 美国贝尔实验室的D.M.Ritchie设计了B 语言, 并用于编写了第一个UNIX操作系统。 1973年&#xff0c; D.M.Ritchie 在B语言的基础…

嵌入式C语言深入篇之 —— 变量

新建一个物联网行业交流学习QQ群&#xff0c;感兴趣可加&#xff1a;928840648 CUT 变量 可执行程序存储区 当一个C/C原码文件被编译链&#xff08;比如gcc/g&#xff09;编译及链接成为可执行程序后&#xff0c;由4个段组成&#xff0c;分别是&#xff1a;代码段&#xff…

嵌入式C语言编程技巧

基础语法编程技巧 变量 &#xff08;1&#xff09;变量名需见名知意&#xff0c;用英文单词命名&#xff0c;尽可能避免出现 a b 等单一字母的变量 &#xff08;2&#xff09;变量在定义同时进行初始化&#xff0c;防止乱码数据 &#xff08;3&#xff09;变量序号尽可能用英语…

嵌入式C语言强化学习——(嵌入式学习路线1)

前言 从零开始记录自己学习嵌入式&#xff0c;之前看稚晖君的视频&#xff0c;里面的费曼学习法觉得对自己很有帮助&#xff0c;所以准备把自己学习到的东西分享出来&#xff0c;便于学的更深&#xff08;符合费曼学习法&#xff09; 众所周知&#xff0c;嵌入式编一般是使用C…

嵌入式C语言开发

这是我的第一篇对ARM有有疑问并展开调查的文档总结&#xff0c;以备之后查阅。 首先的疑惑是发现之前的源码中都是在对寄存器做操作&#xff0c;所以对寄存器的地址是怎么被确定的就很疑惑。 搜索引擎关键词&#xff1a;嵌入式 寄存器 基地址 使用 参考《嵌入式15——HAL 库中…

嵌入式C语言编译过程

1.预处理 gcc -E -o a.i 001.c 把001.c输出为a.s文件。预处理的本质是把宏定义替换处理。#define ABC 123 2.编译 gcc -S -o a.s 001.c 3.汇编 gcc -c -i a.s 001.c 把c文件生成汇编文件 4.链接 gcc -o build 001.c把001.c生成build.exe可执行文件&#xff0c;从预处理开始。

嵌入式C语言自我修养分享课件

一.异构计算 1.背景&#xff1a; 随着物联网、大数据、人工智能时代的到来&#xff0c;海量的数据分析和大量复杂的运算对CPU 的算力要求越来越高&#xff0c;CPU 的大部分资源用于缓存和逻辑控制&#xff0c;适合运行各种复杂的串行程序&#xff0c;但是单核或者多核CPU处理性…

标准c语言与嵌入式,嵌入式C语言与C语言的区别

嵌入式C语言与C语言的区别&#xff1a;最常用的系统编程语言是C&#xff0c;它是在汇编语言中使用的一种简单的编程语言&#xff0c;源代码采用自由格式。Embeddedc是c语言用于编写嵌入式软件的扩展&#xff0c;这两者有什么区别&#xff1f; 首先是启动过程 1.普通C语言程序的…

嵌入式 C 语言(上)

目录 基础知识数据类型const 用法作用域与 static 用法extern 用法 基础知识 嵌入式C语言和普通C语言在语法上几乎没有差别&#xff0c;其主要差别在于普通C语言的运行环境是OS之上&#xff0c;有很多的标准库函数支撑调用&#xff0c;分配的内存是电脑的内存&#xff0c;其处…

嵌入式C语言

文章目录 一、学会使用char/short/int关键字二、学会使用 if & switch三、学会使用 for & while四、学会使用static关键字五、学会使用define关键字六、学会使用typedef关键字七、学会使用enum关键字八、学会使用struct类型九、学会使用指针类型十、学会使用回调函数十…

嵌入式开发之C语言基础(一)

目前是一名大二升大三的学生&#xff0c;早就有想法写博文了&#xff0c;但是因为自己的拖延一直到现在才开始着手。关于博文&#xff0c;我有以下打算&#xff1a;把C语言再重新过一遍&#xff0c;毕竟嵌入式开发C语言的重要性不言而喻&#xff1b;接下来我还会有一些关于单片…

极简嵌入式C语言教程——从入门到入土(1)

文章目录 第一章&#xff1a;入门1.Hello World!2.C语言标识符与关键字(1)标识符&#xff1a;(2)关键字 3.数据类型与运算符(1)变量与常量<1>变量<2>变量的定义<3>常量 (2)运算符<1>算术运算符<2>自增、自减运算符<3>赋值与赋值组合运算符…

STM32中常用的C语言知识点,开始复习!

要学嵌入式&#xff0c;关注我要学嵌入式&#xff0c;嵌入式猛男的加油站。 C语言是单片机开发中的必备基础知识&#xff0c;这里就列举部分STM32学习中会遇见的C 语言基础知识点。 01 位操作 下面我们先讲解几种位操作符&#xff0c;然后讲解位操作使用技巧。C语言支持如下6中…

嵌入式C语言(入门必看)

目录 STM32的数据类型 const关键字 static 关键字 volatile关键字 extern关键字 struct结构体 enum typedef #define 回调函数 #ifdef 、#ifndef、#else 、#if 嵌入式开发中既有底层硬件的开发又涉及上层应用的开发,即涉及系统的硬件和软件,C语言既具有汇编语言操…

用单层感知器完成逻辑或运算的学习过程

用单层感知器完成逻辑或运算的学习过程 这道题目是我“认知科学”&#xff08;专业必修/doge&#xff09;课程的结课作业题之一&#xff0c;目的在于加深对单层感知器的理解&#xff0c;对于后续学习神经网络打下基础。 有关知识&#xff1a; B站有关视频 单层感知器的学习过…

python中逻辑运算_【多选题】Python 中用于表示逻辑与、逻辑或、逻辑非运算的关键字分别是( ) A. and B. add C. or D. not...

【多选题】Python 中用于表示逻辑与、逻辑或、逻辑非运算的关键字分别是( ) A. and B. add C. or D. not 更多相关问题 A.He has been asked to join the committee.B.There are several new people on the c A.fill inB.equipC.fitD.prove A.encounterB.discernC.seeD.fre…

逻辑运算符简介, 逻辑与,逻辑或,逻辑非和逻辑运算符里的短路运算规则

1&#xff0c;逻辑与 && 符号两边都为true&#xff0c;结果才为true 一假则假 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"…