C语⾔常见问题
1、嵌⼊式与单⽚机的区别
从软件上,⾏业⾥经常把芯⽚中不带MMU(Memory  Management  Unit内存管理单元)从⽽不⽀持虚拟地址,只能裸奔或运⾏RTOS(实时操作系统,例如ucos、华为LiteOS、RT-Thread、FreeRTOS)的system,叫做单⽚机(例如STM32、NXP)
⽽把芯⽚⾃带MMU可以⽀持虚拟地址,能够跑Linux、Vxworks、WinCE、Android这样的“⾼级”的system,叫做嵌⼊式
2、Heap(堆)和Stack(栈)的区别
Heap(堆)上的空间是⼿动分配和释放的,Stack(栈)上的空间是⾃动分配和释放的
3、全局变量和局部变量的区别
1、作⽤域不同:全局变量作⽤域为整个程序,局部变量的作⽤域为当前语句块;
2、内存存储⽅式:全局变量在全局数据区(静态数据区),局部变量存储在栈上;
3、⽣命周期不同:全局变量的⽣命周期和程序周期⼀样,局部变量随着语句块的结束⽽结束;
4、当局部变量和全局变量同名时,优先使⽤局部变量,使⽤全局变量是要⽤域成员运算符;
4、结构体和联合体的区别
1、结构体和联合体都是由不同的数据类型组成,但在任何时候,联合体只存在⼀个被选中的成员,结构体的所有成员都存在;
2、在结构体中,各成员占有⾃⼰的存储空间,总⼤⼩等于各成员的⼤⼩之和;
3、在联合体中,所有成员共⽤⼀块存储空间,其⼤⼩等于联合体中最⼤成员的⼤⼩;
5、数组和指针的区别
1、指针要么在静态存储区,要么在栈上被创建。数组名对应着⼀块内存,其容量与地址在⽣命周期内保持不变;
2、指针可以随时指向任意类型的内存块,它的特征是可变,⽐数组灵活,但也危险;
6、指针函数和函数指针的区别
1、指针函数是⼀个函数,它返回值是⼀个指针;
2、函数指针是⼀个指针,这个指针所指的对象是⼀个函数;
字符串拷贝函数strcpy作用
7、常量与变量的区别
1、常量是只读不可写,变量可读可写;
2、常量必须初始化,变量可以不初始化;
3、常量不可以寻址,它的地址不可赋给⾮常量指针,变量可以寻址;
8、指针⾃增⾃减与变量⾃增⾃减有什么区别
指针⾃增⾃减是改变指针所指的对象;变量⾃增⾃减是改变变量的值。
9、#error的作⽤是什么
编译程序时,只要遇到#error就会跳出⼀个编译错误
10、#include <file.h> 与#include “file.h”有什么区别
#include <file.h> 表⽰该⽂件存在编译器指定的标准头⽂件存放处;#include “file.h”表⽰该⽂件在⽤户当前的⼯作⽬录下
头⽂件中的 ifdef /define    endif的作⽤:防⽌头⽂件被重复引⽤。
10、常见的条件语句⽐较写法
1、bool类型  if(flag)建议使⽤
2、int类型  if(value  !=  0)建议使⽤
3、float   if( x  > -EPSION &&  x  < EPSION )建议使⽤
4、指针  if(p == NULL)建议使⽤,强调p为指针;不建议if(p == 0)会让⼈误解为int类型
11、⽤#define实现宏并求最⼤值最⼩值
#define    MAX(x,y)    ((x)>(y))?(x):(y)
#define    MIN(x,y)    ((x)<(y))?(x):(y)
12、break语句与continue语句有什么区别
continue语句只能出现在循环语句中,表⽰结束本次循环;break语句还可以出现在switch语句中,表⽰结束switch语句。在循环语句内表⽰结束整个循环。
13、static关键字的作⽤
1、⽤于全局变量:表⽰该变量是静态全局变量。作⽤域为当前⽂件;
2、⽤于函数:该函数为静态函数,只能在本⽂件中调⽤。静态函数在内存中只有⼀份,普通函数在内存中维持⼀份拷贝;
3、⽤作局部变量:为静态局部变量,只初始化⼀次。之后调⽤函数都是上次函数退出时的值。即改变变量的⽣存周期为整个程序运⾏的时间段内;
4、static成员函数:表⽰这个函数属于此类⽽不属于此类的任何对象,不能访问⾮静态变量和函数,该函数在该类中是唯⼀的。
14、const关键字的作⽤
1、修饰⼀般变量和数组:修饰符可在类型说明符前,也可在类型说明符后;
2、修饰常指针:
const修饰指针指向的对象,指针可变,指针指向的对象不变
const int  *A;
const修饰指针指向的对象,指针可变,指针指向的对象不变
int const  *A;
const修饰指针,指针不可变,指针指向的对象可变
int * const  A;
15、const与宏的区别
1、编译时刻:宏在预编译时刻,const在编译时刻;
2、编译检查:宏不会编译检查,const有编译检查
3、宏可以定义函数、⽅法等,const不可以
4、⼤量使⽤宏会导致预编译时间过长
16、带参宏与函数的区别
1、处理时刻不同:宏在编译时刻,函数在运⾏时刻;
2、带参宏没有参数类型,函数具有参数类型;
3、带参宏不分配内存,函数需要分配内存;
4、宏不占⽤运⾏时间,函数在调⽤时刻和返回时刻占⽤时间;
17、引⽤与指针的区别
1、⾮空区别:指针可以指向NULL,引⽤必须指向某个对象;
2、可修改区别:指针可以指向不同的对象,引⽤总是指向初始化的对象;
3、合法性区别:在使⽤指针之前要判断指针是否为NULL,引⽤不需要判断;
18、malloc()与colloc()的区别
1、malloc()与colloc()都是在堆上申请动态内存空间;
2、malloc()只有⼀个参数,即要分配内存⼤⼩;
3、colloc()函数有两个参数,分别是元素的个数与元素的⼤⼩;
4、malloc()不能对内存初始化,colloc()对内存的每⼀位初始化为0;
19、strcpy 、sprint、 memcpy函数的区别
strcpy 函数操作的对象是字符串,完成从源字符串到⽬的字符串的拷贝;
sprint函数操作的对象不限于字符串,是实现其他数据类型吸纳⾼字符串的转化。⽅法中需要指定数据源对象的数据类型,如果源对象是字符串,也可以实现字符串的拷贝功能。
memcpy内存的拷贝,实现将⼀个内存的内容复制到另⼀个内存块,内存块由⾸地址及长度决定。
20、strcpy函数为什么要返回char *类型
增加代码的灵活性,⽅便其他函数直接调⽤
21、new  delete与malloc  free的联系与区别
1、都是在堆上进⾏动态内存的分配与释放;
2、new  delete是C++的运算符,malloc  free是函数;
3、new会⾃动调⽤对象的构造函数,返回相应的类型;
4、malloc只会申请指定⼤⼩的内存,返回void *类型,不能初始化对象;
5、delete与new配对,会调⽤析构函数;
6、free与malloc配对,只是内存的释放,不会调⽤析构函数;
22、关于静态内存的分配和动态内存的分配的区别及过程
1、静态内存的分配是在编译时刻完成的,不占CPU资源。动态内存的分配是在运⾏时刻完成的,分配与释放占⽤CPU运⾏时间;
2、静态内存分配是在栈上完成的,动态内存分配是在堆上完成的;
3、动态内存分配需要指针或引⽤数据类型的⽀持,⽽静态内存分配不需要;
4、静态内存的分配是按照计划分配的,在编译前确定内存块的⼤⼩;动态内存分配运⾏时按需分配;
5、静态内存分配是把内存的控制权交给了编译器;动态内存分配是把内存的分配交给了程序员;
6、静态内存分配的效率⽐动态分配内存的效率⾼,因为动态内存的分配与释放需要额外的开销;动态内存管理⽔平,严重依赖于程序员的⽔平,处理不当容易造成内存泄漏;
23、⼀个短⼩的函数在C与C++中分别⽤什么实现
在C中⽤宏实现,在C++中⽤内联函数实现
24、在C++程序中调⽤被C编译器编译后的函数,为什么要加extern C
C++语⾔⽀持函数的重载,C语⾔不⽀持函数的重载,编译后参数的名字不同,函数被C++编译器编译后产⽣的名字为函数名加参数列表类型名之类的名字。
⽽C编译器编译后产⽣的名字为函数名。
25、⼀个由C/C++编译器编译过的程序由哪⼏部分组成
1、栈区:由编译器⾃动编译、释放、存储函数参数的值、局部变量的值等,其操作⽅式类似于数据结构;
2、堆区:由程序员分配与释放,如果程序员没有释放,在程序结束时由OS释放,存储结构类似于链表;
3、全局变量和静态变量存储在⼀起
4、⽂字常量区:常量、字符串存放于此,程序结束后⾃动释放;
5、程序代码区:存放函数的⼆进制代码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。