软件工程师面试经典问题

2023-05-16

/*

大部分内容来自《高质量C++/C 编程指南》 和《嵌入式程序员应知道的0x10个问题》的补充整理

*/

1 如何避免重复包含头文件?
答:使用#ifndef/#define/endif.

2 #include <filename.h> 和 #include “filename.h” 有什么区别?
答:对于#include <filename.h> ,编译器从标准库路径开始搜索 filename.h
      对于#include “filename.h” ,编译器从用户的工作路径开始搜索 filename.h

3 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
答:#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
//注意以下几点:
1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3) 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。

4 分别用宏定义和函数实现:free一段内存并将指针置为空.
答:宏定义:#define MY_FREE(ex)  free((ex));/
                                                      ex = NULL;
      函数:  void MyFree(void **ex)
                 {
                           free(*ex);
                           *ex = NULL;
                  }
下面的回答是错误的,因为指针没有被赋值为空:

        函数:  void MyFree(void *ex)
                 {
                           free(ex);
                           ex = NULL;
                  }

5 const 有什么用途?
答:(1) 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
      (2) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑高效的代码。
      (3) 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。注意是代码修改,无法防止DMA、其他CPU、其他线程等编译器不能知道的隐式修改。

6 static有什么用途?
答:(1)用来修饰全局变量,该变量只能在模块内被引用,提高封装性和健壮性。如果不得已需要定义全局变量并且该全局变量需要被其他模块访问,建议如下做法:
/****************source code**********************/
static int gExampleVar = 0;

int GetExampleVar(void)
{
      return gExampleVar;
}

void SetExampleVar(int var)
{
      gExampleVar = var;
}

/************************************************/
(2)用来修饰函数,该函数只能在模块内被调用,提高封装性和健壮性。
(3)用来修饰局部变量,变量的值会像全局变量一样被保留。不建议使用。

7  volatile的用途?并给出例子。
答:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
(1) 并行设备的硬件寄存器(如:状态寄存器),或者GPIO等等。
(2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
(3) 多线程应用中被几个任务共享的变量
(4)可以被不止一个CPU访问的变量,如ARM和DSP双核均可访问的变量;或者可以被CPU和DMA访问的变量。
总之,当变量对应的地址中存储的内容,除了可能被当前线程显式修改外,还可能被当前cpu的其他线程、其他cpu、硬件设备隐式修改时,必须使用volatile修饰。优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

附: 一个变量既可以是const还可以是volatile,因为实质上,const和volatile扯不上半点关系,const修饰一个变量是不允许该变量被代码显式修改,而volatile修饰一个变量表示该变量可能被隐式修改。一个例子是只读的状态寄存器。它是volatile因为它可能被隐式修改了,它是const因为代码不应该试图去修改它。

8 inline的用途?
答:被inline修饰的函数会被直接编译进该函数的调用者中,会节省函数调用花掉的时间。那为什么不用宏定义,因为可以提供输入参数和返回值的类型检查。为什么不直接写到被调用者函数中,因为可以提高可读性,重用性(意义同宏定义)。

9 用变量a给出下面的定义
a) 一个整型数(An integer)
b)一个指向整型数的指针( A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)r 
d)一个有10个整型数的数组( An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to  integers)
f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function  that takes an integer as an argument and returns an integer)
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )
答:a) int a; // An integer 
b) int *a; // A pointer to an integer 
c) int **a; // A pointer to a pointer to an integer 
d) int a[10]; // An array of 10 integers 
e) int *a[10]; // An array of 10 pointers to integers 
f) int (*a)[10]; // A pointer to an array of 10 integers 
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer 
h) int (*a[10])(int); // An array of 10 pointers to  functions that take an integer argument and return an  integer 

10 解释下面的定义
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
答:前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向 整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整 型数是不可修改的,同时指针也是不可修改的)。

11 定义一个函数指针变量和声明一个函数指针类型,并用该指针类型定义一个变量(该函数指针返回类型为int,并带一个int类型的参数)

12 在位宽为32bits的机器上,计算下列sizeof的值?
void Func ( char str[100])
{
    sizeof( str ) =     //4,指针长度
}

char str[] = “Hello” ;
char *p = str ;
int n = 10;
sizeof (str ) =     //6,数组长度,包括’/0’
sizeof ( p ) =      //4,指针长度
sizeof ( n ) =      //4,int 型指针长度

void *p = malloc( 100 );
sizeof ( p ) =      //4,指针长度

答:4,6,4,4,4

13 内存分配
 鍐呭瓨鍒嗛厤1

鍐呭瓨鍒嗛厤2

14  给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。
答:
#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void) 
{
       a |= BIT3;
}
void clear_bit3(void) 
{
       a &= ~BIT3;
}

15  评价下面的代码片断:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF; 
/*1's complement of zero */
答:对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:
      unsigned int compzero = ~0;

16 下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius) 
{
     double area = PI * radius * radius;
     printf("/nArea = %f", area);
     return area;
}
1)ISR 不能返回一个值。
2) ISR 不能传递参数。
3) 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
4) 与第三点一脉相承,printf()经常有重入和性能上的问题。

17 解释ZI,RW,RO,加载域,运行域。
答:RO就是readonly,包括代码和const 数据;RW就是read/write,包含被初始化成非0值的全局变量;ZI就是zero,包含没有初始化和被初始化成0的全局变量。
加载域指binary烧入Flash中的状态,该 binary包含RW和RO段,对于比较简单的情况,可以在ADS集成开发环境的ARM LINKER选项中指定RO BASE和 RW BASE,告知连接器RO和RW的连接基地址。对于复杂情况,如RO段被分成几部分并映射到存储空间的多个地方时,需要创建一个称为“分布装载描述文件”的文本文件,通知连接器把程序的某一部分连接在存储器的某个地址空间。需要指出的是,分布装载描述文件中的定义要按照系统重定向后的存储器分布情况进行。
Binary之所以不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。
运行域指程序运行时存在于RAM中的状态,此时会给ZI段分配内存空间。

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

软件工程师面试经典问题 的相关文章

  • 乐鑫 × 全国大学生物联网设计竞赛|探究基于 ESP32-S3 的农业革新应用

    2023 年全国大学生物联网设计竞赛 xff08 下简称 竞赛 xff09 现已官宣启幕 xff01 乐鑫科技 688018 SH 作为竞赛金牌合作伙伴 xff0c 将为同学们带来基于 AI SoC ESP32 S3 的独立竞赛任务 xff
  • Arduino 即将发布集成乐鑫 ESP32-S3 的 UNO R4

    3 月 25 日 xff0c Arduino 宣布将于 5 月底发布 Arduino UNO 的最新版本 Arduino UNO R4 UNO R4 不仅保持了 UNO 家族的显著特征 xff0c 如标准的外形尺寸 屏蔽兼容性和 5 V 工
  • ROS编译程序缺少串口包

    1 问题 此种情况是缺少ros的串口包 2 解决办法 通过sudo apt get install ros lt distro gt serial下载ROS对应版本的工具包 lt distro gt 为对应ros版本 xff0c 如下 xf
  • 如何在 Espressif-IDE 中使用 Wokwi 模拟器

    乐鑫近期已发布 Espressif IDE v2 9 0 xff0c 您可直接在此版本的 IDE 中使用 Wokwi 模拟器 什么是 Wokwi 模拟器 xff1f Wokwi 是一款在线电子模拟器 xff0c 支持模拟各种开发板 元器件和
  • 使用乐鑫 Web IDE 助力物联网开发

    乐鑫 Web IDE 是基于 Eclipse Theia 的框架 xff0c 支持 ESP IDF VS Code 插件同时具备多项辅助工具 您可以观看我们在 Espressif DevCon22 上的演示视频 xff0c 了解它的实际应用
  • Rust + 嵌入式:强力开发组合

    Rust 的由来 Rust 编程语言的灵感诞生于一次意外 2006年 xff0c 当 Graydon Hoare 回到位于温哥华的公寓时 xff0c 发现电梯又因为软件崩溃出了故障 住在 21 楼的他无奈爬楼时 xff0c 不禁心想 xff
  • ESP32 应用实践:ethernet 转 WiFi 实现

    一 xff1a 简介 Ethernet 转 WiFi 用于实现以太网口的设备通过 WiFi 进行无线互联 将从设备 发出的 802 3 帧数据转化为 802 11 帧数据发送出去 xff0c 接收到的 802 11 帧数据转换为 802 3
  • ESP8266/ESP32 相关问题初步排查方法

    一 更多开发细节请访问 ESP 开发参考链接 二 故障排查 三 当前已发布文章 外设 Peripherals ESP32 ESP32 ULP 协处理器简介和汇编编译环境设置 ESP32 ULP 协处理器在低功耗模式下操作 RTC GPIO
  • ESP32 低功耗方案设计

    ESP32 低功耗方案概述 ESP32 在内置 Deep sleep 低功耗模式 RTC 外设和 ULP 协处理器的支持下 xff0c 可以满足多种应用场景下的低功耗需求 当 ESP32 进入 Deep sleep 模式时 xff0c 所有
  • 树莓派开机自动连接WiFi 及树莓派设置固定IP地址

    树莓派实现自动驾驶小车第二步 树莓派开机自动连接WiFi 树莓派设置固定IP地址 xff08 内有树莓派连不上WiFi的奇怪bug及解决方案 树莓派开机自动连接WiFi 第一步我们已经通过有线ip ssh连接到树莓派了 xff0c 开启VN
  • 关于51单片机不显示串口号的问题

    项目场景 xff1a 普中科技烧录软件查询不到串口号问题 问题描述 本人设备型号是普中科技的HC6800 xff0c 在安装好烧录软件 xff0c 电脑与单片机连接完成时 xff0c 发现烧录软件查询不到串口号 原因分析 xff1a 1 烧
  • Linux:git报错 - git-lfs filter-process: git-lfs: command not found

    在pull远程主分支代码时 xff0c 出现了如下错误 xff1a git span class token operator span lfs span class token builtin filter span span class
  • WIN10Linux子系统WSL2.Ubuntu18.04环境下ROS-Melodic安装与测试

    WIN10Linux子系统WSL2 Ubuntu18 04环境下ROS Melodic安装与测试 xff0c 待完善 一 首先是WSL2 Ubuntu18 04的安装二 通过xfce4 VcXsrv实现图形化界面1 WIN10安装VcXsr
  • TX 下常用的查询指令

    查看Jetson TX2 L4T版本 head n 1 etc nv tegra release 查看系统版本 cat etc lsb release 查看系统l内核 uname a 查看内存 free m 查看CPU详情 lscpu 查看
  • ubuntu远程桌面控制另一台电脑:teamviewer或VNC.附带远程rviz打不开解决方法

    远程控制方案 xff1a 1 xff1a teamviewer xff1b 2 xff1a VNC 43 vnc viewer xff1b 3 xff1a VNC 43 系统自带桌面共享 1 xff0c 搜索ubunutu安装teamvie
  • 《控制论导论》读书:基本概念

    前言 本系列读书笔记主要来自W R Ashby的 控制论导论 一书 该书最先成于上个世纪60年代 xff0c 如今已绝版且未再版 Ashby本人对控制论在生物医学领域的应用有深入的研究 xff0c 该书也进行了一定阐释 作为一个对复杂系统理
  • 每周五条-002

    2020 4月第4周 职场 假如开发人员 耍大牌 xff0c 十有八九是井底之蛙 xff0c 盲目自大 产品 产品不能一直靠人手动维护它正常运作 xff0c 一定要让客户自己有功能来解决实际问题 有些一时找不到原因的异常问题习惯了软件公司自
  • visual svn修改新url地址方法(linux,windows,centos)

    在工作环境调整时 有的时候SVN服务器的地址需要修改 xff0c 此时我们如何修改本地库的地址 xff0c 而不用重新下载呢 xff1f SVN中有一个简单的解决办法 xff1a 1 环境为windows7 在工作复本的根目录上右键 gt

随机推荐

  • 小公司项目经理的一天,记录我普通的一天

    团队5人 xff0c 电子商务Web项目 xff0c 前段时间离职2人 xff0c 尚未补充 xff0c 手下现有一个开发组长 一个程序员 一个美术设计 一个运营专员 xff0c 还算一个完整的战斗单位 直接汇报对象 xff0c 几乎是老总
  • 关于ASP.NET木马ASPXSPY的初步处理研究

    前段时间服务器中了木马了 xff0c 经过排查 xff0c 截获了ASPXSPY木马 该木马是用ASP NET写的 xff0c 为了知己知彼 xff0c 就将木马拷到本地运行研究 xff0c 发现功能真的很强大 xff0c 自认为服务器设置
  • 身于“乱世”,我们程序员应该如何打算?

    不仅要低头拉车 xff0c 还要抬头看路 在周末夜深人静的时候就要思考一下人生 此 乱世 虽非战火纷飞 民不聊生的彼乱世 xff0c 但是整个社会的观感确实让人不得不焦虑 xff1a 不断飞涨的物价 xff0c 让买猪肉鸡蛋都觉得有压力 x
  • 开发人员流失之痛和团队重建之困

    最近笔者正在经历人员流失和团队重建的难题 xff0c 趁周末整理一下思路 xff0c 准备重整旗鼓 今年也算是多事之秋 xff0c 作为公司一员 xff0c 于公于私都有些坐不住了 面对开发人员 xff08 当然其他部门也有辞职 一个一个的
  • 从电影《三傻大闹宝莱坞》看IT新手应如何学习?

    三傻大闹宝莱坞 电视上又在放 xff0c 又看了一遍 xff0c 觉得很赞 很喜剧 很有意义 很励志 追求卓越 xff0c 成功将不穿裤子追着你跑 代替富翁主人儿子去读大学的兰乔在学校干了很多离经叛道的事情 xff0c 由此也产生了许多爆笑
  • 程序员,2012,不再生活在别处

    2011走到了尽头 xff0c 这一年有太多事情值得去书写和记忆 xff1a 浪漫的自行车户外婚礼 xff0c 历尽艰辛迎来了小宝宝 xff0c 整个部门业绩比去年增长了几倍 阳春三月 xff0c 黄道吉日 xff0c 在一群年轻朝气的自行
  • RTX, uCOS-II, FreeRTOS embOS, uCOS-III的综合性能PK

    这5款OS的PK主要分为以下四个方面 1 FLASH和RAM的需求对比 2 功能对比 3 实时性对比 4 安全性对比 1 FLASH和RAM的需求对比 RTX uCOS II FreeRTOS embOS uCOS III FLASH lt
  • 当段子手已经hi起来的时候,产品经理也来瞎逼逼一下faceid

    苹果发布会后 xff0c 各种段子满天飞 xff0c 着实热闹了一把 比较经典的包袱是 xff1a 老婆被老公刷脸 xff1b 被打成熊猫后没法报警 xff1b 韩国人没法用 xff1b 比较正式的疑问是 xff1a 双胞胎怎么办 xff1
  • SQL 2005安装时报已经安装了同名实例的问题解决。(无法正确卸载干净时最管用)

    最近重装SQL2005 xff0c 卸载后报 SQL 2005此计算机上已经安装了同名实例 说明原来的安装没有卸载干净 需要按照如下办法 1 停止服务 停止所有与SQL Server相关的服务 2 清楚残留的安装 使用windows ins
  • .NET Reflector 7.6.1.824安装及破解(刚试了,绝对能用)

    首先下载在这里http download csdn net detail gattaca2011 4578752 xff0c 不要到官网去了 xff0c 因为官网已经是8 0了 然后就是安装 xff0c 运行注册机 xff08 注意断网 x
  • 稍微冷门一点的经验,phpnow不能打开默认页的问题处理

    因为本地调试项目需要 xff0c 需要使用 phpnow 下载安装都很简单 xff0c 可是安装后127 0 0 1显示不出默认页 xff0c 而且一直处于加载状态 尝试 开始以后是一个网卡绑定了多个IP的问题 xff0c 于是移除多个IP
  • 每周五条-001

    2019 第2周 忙碌而焦虑 1 微信 微信支付服务商帐号是不能收款的 xff0c 如果同一个公司已经是服务商 xff0c 也不能在该服务商下创建本身的普通商户号 解决办法直接申请普通商户号 2 微信 听了两天的公开课 xff0c 最大的感
  • OpenWrt 学习笔记【1】LEDE17 安装huawei E8372

    写在前面的话 xff1a 路由器本身刷了LEDE后只是作为千兆交换机和手机wifi共享器 家中光线猫位置尴尬 xff0c 被关在入户的接线盒里 xff0c 信号差的一塌糊涂 xff0c 本来只是在luci界面直接尝试路由器自身2 4Gwif
  • Python3.6.2 pip install 报 【Fatal error in launcher: Unable to create process using ' " ' 】

    win10pro 原来的同事装了3 6 x xff0c 但是啥库都没安 xff0c 另一台自己的电脑原先安过需要的库 xff08 如h5py xff0c tf xff0c mkl等等 xff09 直接一波操作打压缩包拷过去解压覆盖 xff0
  • Keras2.2.2离线安装依赖包依赖Keras2.1.6解决方法。

    离线使用pip install 本地的whl包 xff0c 结果发现keras2 2 2安装失败 xff0c 照着提示依赖找到了Keras Applications 1 0 4与Keras Preprocessing 1 0 2 xff0c
  • 系统时间【linux基础】

    基础tip 备忘 who命令 1 xff09 who b 查看最后一次系统启动的时间 xxxxx 64 XXXXX who b system boot 2019 02 10 20 15 2 xff09 who r 查看当前系统运行时间 xx
  • TF踩坑笔记

    遇到领导要求出demo xff0c 尬 xff0c 好久没撸ML了 xff0c 工作两年信息流打杂 xff0c 以前也就叶公好龙毕业前VS编译了一波caffe跑了几个demo xff0c 尬出天际 xff0c 这两天踩坑不少 xff0c 留
  • MDK Trace功能

    RealView MDK可以轻松实现TRACE功能 针对ARM Cortex M3内核的芯片 xff0c 只需要要RealView MDK软件和ULINK2仿真器就可以直接实现TRACE功能 xff0c 不需要额外的TRACE硬件仿真器支持
  • 史上最快速的安装Tensorflow方法

    pip install i https pypi tuna tsinghua edu cn simple tensorflow 这里修改成自己需要安装的框架
  • 软件工程师面试经典问题

    大部分内容来自 高质量C 43 43 C 编程指南 和 嵌入式程序员应知道的0x10个问题 的补充整理 1 如何避免重复包含头文件 xff1f 答 xff1a 使用 ifndef define endif 2 include lt file