C/C++面试题3

来源:互联网 发布:北京大学 网络课程 编辑:程序博客网 时间:2024/06/01 10:06

1、/etc/services 定义了网络服务的端口

2、Linux操作系统包括了3种不同的类型的进程

(1)交互进程:由一个shell启动的进程,既可以在前台运行也可以在后台运行

(2)批处理进程:进程序列,和终端没有关系

(3)守护进程:Linux启动时的进程,并且在后台运行

3、Kill发送指定的信号到相应的进程,不指定信号的将发送SIGTERM(15)让进程友好的退出 

4、软件生命周期:从生存到报废的时间

(1)软件计划和可行性探究(问题定义)

(2)需求分析  (确定软件系统必须做什么和必须具备哪些功能)

(3)软件设计(概要设计和详细设计):根据需求分析的结果,对整个系统框架,数据库进行设计

(4)编码

(5)软件测试(分为3阶段(1)单元测试(2)组装测试(3)系统测试)

(6)运行和维护(纠错性和改进性维护)

5、系统调用和库函数的区别?

(1):系统调用的函数如open和write包含在头文件unistd.h中,而库函数调用如fopen和fwrite等包含在头文件stdio.h中

(2):系统调用通常用于底层文件中,如在驱动程序中对设备文件的操作,库函数调用通常用于应用程序中对一般文件的操作

(3):系统调用是于操作系统有关的,不可移植,而库函数调用是与操作系统无关的,可移植性好

6、写一个标准宏,这个宏输入两个参数并返回较小的哪一个:#define MIN(X,Y) (X>Y)?Y:X

7、struct 和class的区别?

(1)默认的继承访问权限。struct是public的,class是private的。

(2)struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。

8、什么是野指针?如何避免?

野指针:指向不确定地址的指针变量。(即没有初始化)使用野指针易因内存泄露出现段错误。而造成内存泄露的原因有两个:

1.访问了没有权限的内存(平时我们正确使用指针的时候,系统应经将相应的内存分配给用户,但是如果指向没有分配的内存,系统会判定我们没有权限)
2.访问了已经释放了的内存。


为避免使用无效地址访问内存,一般在申请指针变量时,将指针变量赋0值,在以后的程序设计中,要使用这个指针前,先判断是否是0值,如果是,则报错,如果使用某指针完毕,确保其他部分程序误使用指针时,也可以将这个使用完的指针再次赋0值(NULL)。
因为野指针主要是因为我们平时编程习惯造成的,因此我们只能避免野指针的出现,而不能杜绝。(请注意用词)我们在编程时,做到以下几点可以有效地避免野指针的出现。
第一,当一个指针没有指向时,我们一般默认指向NULL。(NULL代表内存的0地址,并且NULL是不允许做任何操作的)


第二,使用malloc分配内存。(在堆空间里分配内存)
#difine  MAX_SIZE  1024;
char *ptr = (char *) maollc  (sizeof (char) * MAX_SIZE);


请认真研究这样的表达式的优点,这个表达式在代码的维护性,扩展性都大大提高了。这方面是我们平时写代码时所应该提高的。


使用malloc也是有讲究的,我们应该依照下面的流程:
1.分配内存。(分配成功,返回内存的首地址;分配不成功,返回NULL)。
2.检查是否分配成功(若失败,则  exit(1) 退出程序)。
3.清空内存中的数据 (malloc分配的空间里可能存在垃圾值,因此我们需要清空,可以用到memset或bzero 函数)。
4.使用内存。
5.释放内存(free,这时ptr又变成野指针)。
6.写成NULL。

9、C语言分配内存的方式有哪些?C语言中常见的内存错误有哪些?

1. 从静态存储区域分配

内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

2.在栈上创建

在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

3.从堆上分配,亦称动态分配

程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

 

C语言常见的内存错误:

1:内存未分配成功,却使用了它。

方法:在使用之前检查指针是否为NULL。

   1)当指针p是函数的参数时,在函数入口处用语句assert(p!=NULL)进行断言检查。

   2)当使用malloc或new来申请内存时,应该用if(p != NULL)进行防错检查。

 

2:引用了尚未初始化的指针

原因:内存的缺省初始值究竟是什么并没有统一的标准,在使用之前都进行初始化。

  1)没有初始化的观念。

  2)内存的缺省值是未定义,即垃圾值。

 

3:越界操作内存

原   因:内存分配成功且初始了,但越界操作是不允许的。

例   如:在使用数组时经常发生下标“多1”或“少1”,特别是在for循环语句时。

 

4:忘记释放内存,造成内存泄漏。

原因:含有这种类型错误的函数,每被调用一次,就丢失一块内存。当内存充足时看不到这种错误带来的影响,当内存耗尽时系统提示:“内存耗尽”。因此,动态内存的申请与释放必须配对,程序中malloc与free的使用次数要相同。

 

5:释放了内存却继续使用它

原因:对应的情况有2种

   1)返回了“栈内存的指针或引用”,因为堆栈中的变量在函数结束后自动销毁。

   2)某块内存被free后,没有将指向该内存的指针设置为NULL,导致产生“野指针”。

10、MMU是什么?功能是什么?

MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,
同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。

11、协处理器是做什么的?ARM核中有多少个协处理器?

协处理器(coprocessor),一种芯片,用于减轻系统微处理器的特定处理任务
ARM 微处理器可支持多达 16 个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略 ARM 处理器和其他协处理器的指令。
ARM 的协处理器指令主要用于 ARM 处理器初始化 ARM 协处理器的数据处理操作,以及在ARM 处理器的寄存器和协处理器的寄存器之间传送数据,和在 ARM 协处理器的寄存器和存储器之间传送数据。 


ARM协处理器包括以下5条:
CDP:协处理器数据操作指令。
LDC:协处理器数据加载指令。
STC:协处理器数据存储指令。
MCR:ARM处理器寄存器到协处理器寄存器的数据传送指令。
MRC:协处理器寄存器到ARM处理器寄存器的数据传送指令

原创粉丝点击