嵌入式常见面试题目

Heap(堆)和stack(栈)的区别

堆上的空间是手动分配与释放的,栈上的空间是自动分配与释放的。堆的空间是有限的,堆的空间是最大的自由储存区。

全局变量与局部变量的区别

  1. 作用域不同:全局变量的作用域为整个程序,局部变量的作用域为当前语句块;
  2. 内存储存方式:全局变量存储在全局数据区,局部变量存储在栈上;
  3. 生命周期不同:全局变量的生命周期和程序一样,局部变量随着语句块的结束而结束;
  4. 当局部变量与全局变量同名时,优先使用局部变量,使用全局变量是要用域成员运算符

结构体和联合体的区别

  1. 结构体和联合体都是由不同的数据类型组成,但在任何时刻,联合体只存在一个被选中的成员,结构体所有成员都存在。
  2. 在结构体中,各成员占有自己的储存空间,总大小等于各成员的大小之和
  3. 在联合体中,所有成员公用一块储存空间,其大小等于联合体中最大成员的大小

数组与指针的区别

  1. 数组要么在静态存储区,要么在栈上被创建。数组名对应着一块内存,其容量与地址在生命周期内保持不变。
  2. 指针可以随时指向任意类型的内存块,他的特征是可变。比数组灵活,但也危险。

指针函数与函数指针的区别

指针函数是一个函数,它的返回值是一个指针。函数指针是一个指针,这个指针指向的对象是一个数组。

常量与变量的区别

  1. 常量是只读不可写,变量可读可写常量必须初始化,变量可以不初始化;
  2. 常量不可以寻址,它的地址不可赋值非常量指针;变量可以寻址,敞亮的效率比变量高。

指针自增自减与变量自增自减有什么区别

指针自增自减是改变指针所指向的对象,变量自增自减是改变变量的值;

#error的作用是什么

编译程序时,只要遇到error就会跳出一个编译错误

#include <stdio.h>与#include "stdio.h"有什么区别

  1. <stdio.h>表示的是该文件存在编译器指定的标准头文件存放处
  2. "stdio.h"表示的是该文件在用户当前的工作目录下

头文件中的ifdef/define endif的作用是什么

防止头文件被重复引用

常见的条件语句的比较的写法

  1. bool类型; if(flag) 建议使用;if(flag == true)不建议使用,true的值定义是没有统一的标准的;
  2. int类型;if(flag != 0)建议使用;if(flag)不建议使用,会让人误以为是
    Bool类型
  3. float类型;if(flag > -EPSON && flag < EPSON)建议使用;if(flag == 0.0)不建议使用,精度问题
  4. 指针;if(p == NULL)建议使用,强调p为指针;if(p == 0)不建议使用,会让人误以为是int类型

用#define实现宏并求最大值与最小值

#define MAX(X,Y) ((X)>(Y)?(X):(Y))
#define MIN(X,Y) ((X)<(Y)?(X):(Y))

break语句与continue语句的区别

  1. continue语句只能出现在循环语句内,表示结束本次循环;
  2. break语句还能出现在switch语句中,表示结束switch语句,出现在循环语句中,表示结束整个循环。

Static关键字

  1. 用于全局变量:表示该变量是静态全局变量,作用域为当前文件
  2. 用于函数:该函数为静态函数,只能在本文件中调用;静态函数在内存中只有一份,普通函数在内存中只有一份拷贝;
  3. 用于局部变量:为静态局部变量,只初始化一次,之后调用函数都是上次函数退出的值。即改变变量的生存周期为整个程序运行时间段内。
  4. static成员函数:表示这个函数属于此而不属于此类的任何
  5. static成员变量:表示该变量属于此类而不属于此类的任何对象,该变量的初始化在此类体外。

const 关键字

  1. 修饰一般常量:修饰符可在类型说明符前也可以在类型说明符后;举例:int const x = 2;或 const int x = 2;
  2. 修饰数组:修饰符const可以用在类型说明符前,也可以用在类型说明符后;例如:int const a[5]={1,2,3};或 const int a[5]={1,2,3};
  3. 修饰常指针:const int *A; //const修饰指针指向的对象,指针可变,指针指向的对象不可变;
    举例:int const *A; //修饰指针指向的对象,指针可变,指针指向的对象不可变; int *const A;//const修饰指针,指针不可变,指针指向的对象可变;

const与宏的区别

  1. 编译时刻 宏:在与编译时刻,const:在编译时刻
  2. 编译检查 宏不会编译检查,const有编译检查
  3. 宏的好处 宏可以定义函数、方法等,const不可以
  4. 宏的缺点 大量使用宏,会导致预编译的时间过长

引用与指针的区别

  1. 非空区别:指针可以指向NULL,引用必须指向某个对象
  2. 可修改区别:指针可以指向不同的对象,引用总是指向初始化的对象
  3. 合法性区别:在使用指针之前要判断是否为NULL,引用不需要判断

malloc()与calloc()的区别

  1. malloc与calloc都是从堆上动态申请内存空间。
  2. malloc只有一个参数,即要分配的内存大小。
  3. calloc函数有两个参数,分别是元素的个数与元素的大小。
  4. malloc不能对内存初始化,calloc堆内存的每一位初始化为零。

strcpy sprint和memcpy的区别

  1. strcpy函数操作的对象是字符串,完成从源字符串到目的字符串的拷贝
  2. sprint函数操作的对象不限于字符串,是实现其他数据类型先给高字符串的转化,方法中需要指定源对象的数据类型,如果源对象是字符串,也可以实现字符串的拷贝功能。
  3. memcpy函数是内存的拷贝,实现将一个内存的内容复制到另一个内存块。内存块由首地址及长度决定。

strcpy为什么要返回char *类型

增加代码的灵活性,方便其他函数直接调用

关于静态内存的分配和动态内存的分配的区别及过程

  1. 静态内存的分配是在编译时完成的,不占用CPU资源;动态分配内存是在运行时刻完成的,分配与释放占用CPU的运行时间
  2. 静态内存分配是在栈上的,动态内存是在堆上分配的。
  3. 动态内存分配需要指针或引用数据类型的支持,而静态内存分配不需要
  4. 静态内存的分配是按计划分配的,在编译前确定内存块大小,动态内存分配运行时按需分配
  5. 静态内存的分配是把内存的控制交给了编译器,动态内存的分配是把内存的分配交给了程序员
  6. 静态内存分配的效率比动态内存的效率高,因为动态内存的分配与释放需要额外的开销;动态内存管理水平严重依赖于程序员的水平,处理不当容易造成内存泄漏

一个短小的函数在C和C++中用什么实现

C++中用内联实现,C中用宏实现

在C++程序中调用被C编译器编译后的函数,为什么要用加extern C?

C++语言支持函数的重载,C语言不支持函数的重载。编译后参数的名字不同,函数被C++编译器编译后产生的名字为函数名加参数列表类型名之类的名字。而C编译器编译后产生的名字为函数名

一个由C/C++编译器编译过的程序有哪几个部分?

  1. 栈区:由编译器自动编译,释放;储存函数参数的值、局部变量的值等,其操作方式类似于数据结构中的栈。
  2. 堆区:有程序员分配与释放;如果程序员没有释放,在程序结束时由OS释放,储存方式类似于链表。
  3. 全局区全局变量和静态变量储存在这一块,初始化的全局变量和静态变量在一块,未出货的全局变量存放在静态变量相邻的一块,程序结束后由系统释放。
  4. 文字常量区:常量字符串存放在此处,程序结束后系统自动释放
  5. 程序代码区:存放函数体的二进制代码

C语言和C++语言有什么区别

C预言师面向结构化的编程语言,它是面向过程的,C语言编程考虑的是实现的过程;C++是面向对象的,C++考虑的是整个程序的模型;

面向对象与面向过程的区别

面向对象是一种以对象为中心的编程思想,比如说:程序=对象+消息;
面向过程是一种以应用为中心的编程思想,以算法进行驱动,程序=算法+数据;

"extern C"的作用

extern c是告诉编译器这段代码以C语言进行编译

软件测试的方法有哪几类

两类;黑盒:针对系统功能进行测试;百合:测试函数的功能;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值