C/C++笔试面试真题
最佳答案 问答题库718位专家为你答疑解惑
C/C++笔试面试真题
已经更新到 45
题了
1、堆和栈的区别
1、栈由系统自动分配,而堆是人为申请开辟;
2、栈获得的空间较小,而堆获得的空间较大;
3、栈由系统自动分配,速度较快,而堆一般速度比较慢;
4、栈是连续的空间,而堆是不连续的空间。
2、什么是野指针?产生的的原因?
野指针的指向的位置是随机,是不正确的指针。
原因:1、创建指针时没有对指针进行初始化
2、释放指针后没有将指针指向的内存置NULL
char *p = (char *)malloc(sizeof(10));
free(p);
p = NULL;
3、进程间通信的方法
1、管道(有名管道和无名管道)
2、信号量
3、消息队列
4、共享内存
5、信号灯集
6、网络套接字(socket)
4、程序中的内存分配方法
1、连续分配方式
2、基本分页存储管理方式
3、基本分段存储管理方式
4、段页式分配方式
5、malloc 和 new 的区别
1、malloc 是C函数,new 是C++关键字
2、申请的内存所在位置不同:malloc 函数是从堆空间上动态分匹配内存;new 操作符是从自由内存上为对象动态分配内存空间。
3、返回类型安全性不同:malloc 内存分配成功则返回(void *)类型,需要强制转换为我们需要的类型;new 成功分配内存则返回对象类型的指针,类型严格与对象匹配,无需进行类型转换,故new 是符合安全性的操作符。
6、为什么局部变量未初始化时,每次初始化的结果是不确定的?
定义局部变量时其实就是再栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。局部变量是存放在栈区中,由系统自动申请和释放,里面的数据可能没有及时的被释放,值是脏的,是不确定的。
7、C语言中volatile的作用和用法
作用:
1、告诉编译器不要优化volatile修饰的变量,这个变量可能会有意想不到的变化。
2、每次读取被volatile修饰的变量时都要从内存中重新读取,而不是从缓冲区和寄存器中读取
用法:
1、状态寄存器
2、多进程访问共享变量
3、终端服务子程序访问的非自动变量
8、编译有几个阶段?每个阶段都了什么事情?
1、词法分析:读入源程序,对源程序的字符流进行扫描和分解,识别出单词
2、语法分析:将单词序列分成不同的语法短语
3、语义分析:检查有没有语义错误
4、中间代码生成:将源程序变成一种内部表示形式
5、中间代码优化:对中间代码进行优化,使之在时间和空间上更加节省
6、目标代码生成:生成汇编指令
9、描述一下数组指针和指针数组
1、数组指针:是一个指针,指向一个数组(指向数组的指针)。
int (*p)[100];
//一般是用来指向二维数组
2、指针数组:是一个数组,数组每个元素都是指针。
int* p[10];
一般用有没有括号()
来区分。
10、指针和引用的区别
1、指针是实体,占用内存空间;引用是别名,与变量共享内存空间。
2、指针不用初始化或初始化未NUL;引用定义时必须
初始化。
3、指针中途可以修改指向;引用不可以;
4、指针可以指向NULL;引用不能为空。
5、sizeof(指针)计算的是指针本身的大小;而sizeof(引用)计算的是它引用的对象的大小。
6、如果返回的是动态分配的内存或对象,必须
使用指针,使用引用会发生内存泄漏。
7、指针使用时需要解引用;引用使用时不需要解引用
8、指针有二级指针,多级指针;引用没有二级引用,没有多级引用。
11、内联函数和宏函数的区别
相同的点:
二者都是通过将函数调用替换成完整的函数体,相比函数调用的时间和空间开销而言,二者都提高了效率。
不同点:
1、宏函数不是函数,而内联函数是函数,因此内联函数可以调试,而宏函数不可以。
2、宏函数的代码展开阶段在预处理阶段,而内联函数在编译阶段,因此内联函数有类型安全检查,而宏函数没有。
3、内联函数可以作为类的成员函数,作为类的成员函数可以访问类中所有的成员(包括private成员),而宏定义不行。
12、在什么情况下栈会溢出?如何避免?
溢出:
1、局部数组过大
2、递归调用层次过多
3、指针或数组越界
避免:
1、增大栈空间
2、改用动态分配内存空间,使用堆(heap)而不是栈(stack)。
13、深拷贝和浅拷贝的区别
1、浅拷贝:只是对指针进行拷贝,拷贝后的两个或多个指针指向原来的同一内存空间。
2、深拷贝:不但对指针进行了拷贝、而且对指针的指向的内容进行了拷贝,两个或多个指针指向不同的内存空间。
14、从一个源文件到可执行文件的过程?
1、预处理:对带
#
的语句进行文本替换、头文件展开、注释删除等,该阶段不会进行语法检查,将产生.i
文件gcc hello.c -E helo.i
2、编译:将预处理的结果编译成汇编语言,进行语法检查,将.i
文件转换为.s
文件,gcc hello.i -S hello.s
3、汇编:将汇编语言转换为二进制机器码,产生.o
文件,gcc hello.s -c hello.o
4、链接:生成可执行文件gcc hello.o -o app
15、#include<>和#include" "的区别
1、#include<>:是在系统下标准库中查找,Linux系统下的标准库在
/usr/include
2、#include" ":系统首先在当前目录中查找,如果找不到,则在标准库中查找。
16、gdb调试
1、编译代码并启动
gcc -g test.c -o app /
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"C/C++笔试面试真题":http://eshow365.cn/6-16252-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!