嵌⼊式常见⾯试题⽬
嵌⼊式常见⾯试题⽬
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作用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语⾔进⾏编译
软件测试的⽅法有哪⼏类
两类;⿊盒:针对系统功能进⾏测试;百合:测试函数的功能;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论