C/C++面试总结必考题

来源:互联网 发布:交朋友的软件 编辑:程序博客网 时间:2024/06/05 18:56

一  C语言部分

1 问:在嵌入式开发中,为什么能通过C语言去直接操作硬件?

答:因为有指针,指针是C语言的灵魂,他可以直接访内存。

 

2 问:链表的作用?

答:用于内存管理,链表节点中的指针域可以将不连续的内存彼此关联起来,从而实现内存的动态管理。

 

3 问:什么变量不能用指针指向?

答:寄存器变量(register修饰),因为这个变量会优先选择存放到CPU寄存器中,而指针只能指向内存的任务区域,但不能指向寄存器。

 

4 问:有符号字符型和无符号字符型变量的最大值和最小值分别是多少(十六进制多少),为什么?

    答:有符号(-128——127-0x80——0x7F);无符号(0——2550——0xFF)

 

5、局部变量能否和全局变量重名?
答:能,局部会屏蔽全局。

 

6、全局变量和局部变量的区别。

  全局变量,储存在静态区.进入main函数之前就被创建.生命周期为整个源程序。

  局部变量,在栈中分配.在函数被调用时才被创建.生命周期为函数内.

 

7、头文件中的 ifndef/define/endif 干什么用?

     防止重复包含

 

8#include  <filename.h>     #include  “filename.h” 有什么区别?

 #include  <filename.h> :<> 告诉预处理器在标准系统目录中寻找文件。

  #include  “filename.h :""告诉预处理器先在当前目录中寻找文件,找不到则再在

                               标准目录下寻找文件。

 

9const 有什么用途?(请至少说明两种)

1定义const常量

 

2const 可以修饰函数的参数、返回值,甚至函数的定义体。

     被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

//指向常整形数的指针变量

const char* p1 = name;//指针所指向的内容不能变,指针指向的地址可变。const char *p //char const *p

//指向整形数的常指针

char* const p2 = name;//地址不可变,内容可变。

//指向常量的常指针

 const char *constname="chen";//地址不变,内容不变。

10.数组与链表的区别。

   数组中的数据在内存是顺序存储的,插入需要移动很多值。
   由于链表是随机存储的,链表访问需要遍历

 

11 、内存的分配:

1、栈区(stack)―   由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 

2、堆区(heap) ―   一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 

3、全局区(静态区)(static)——全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束后有系统释放 

4、文字常量区  ―常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区― 存放函数体的二进制代码。

 

12、sizeof和strlen()的区别

参考答案:
 sizeof是运算符,计算数据所占的内存空间;strlen()是一个函数,计算字符数组的字符数;
 sizeof可以用类型作参数;strlen()只能用char*作参数,必须是以’/0’结束
数组做sizeof的参数不退化,传递给strlen就退化为指针了;
 sizeof操作符的结果类型是size_t,它在头文件中typedefunsignedint类型。该类型保证能容纳实现建立的最大对象的字节大小

 

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

答:c++可以重载,c语言不可以被重载,c++函数提供了c语言连接交换指定函数extern“c”来解决名字问题。

 

14.头文件的作用是什么?
答:1.通过头文件调用库

      2、实现安全检查

 

15 头文件中的ifndef/define/endif的作用?

答:防止头文件被重复引用。


16、 如果一个HEADER头文件要被多个源文件同时#include, 如何避免对HEADER中变量的重复定义?

    答:在某个源文件中对变量定义,在HEADER中仅对变量进行声明,即前面加 extern;

 

16、分别写出BOOL,int,float,指针类型的变量的比较语句。

答:BOOL :if ( !a ) or if(a)
int :if ( a ==0)or(a!=0)
float :const EPSSION 0.000001

if(X>=-EPSSION)&&(X<=EPSSION)
pointer : if ( a != NULL) or if(a == NULL)

 

17、 const与#define相比有何优点

  • const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而#define 只作简单的字符串替换,无类型安全检查。
  • const检查定的类型,如 const float pi = 3.141592653,实际的pi3.141593,因为float类型的有效位限制。
  • const在编译时分配存储空间;而#define在预编译时编译,不分配存储空间。
  • 有些集成化的调试工具可以对const进行调试,但不能对宏进行调试。

18.简述数组与指针的区别?
    数组要么在静态存储区被创建(全局数组),要么在栈上被创建。

   指针可以随时指向任意类型的内存块。

 

19.变量的声明和定义有什么区别?
答:声明变量不分配空间,定义变量要分配空间。声明主要是告诉编译器,后面的引用都按声明的格式。定义其实包含了声明的意思,同时要分配内存空间。

 

20. 解释堆和栈的区别。

答:堆(heap——一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。

栈(stack——由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。由系统自动分配,速度较快。但程序员是无法控制的。

注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。速度比较慢,而且容易产生内存碎片,不过用起来最方便。


21、一个指针可以是volatile?

可以,因为指针和普通变量一样,有时也有变化程序的不可控性。常见例子:

子中断服务子程序修改一个指向buff的指针时,必须用volatile

 

22、内存的分配方式的分配方式有几种?
答:

1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。
2
)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算    内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3
)从堆上分配,亦称动态内存分配。程序在运行的时候用mallocnew申请任意多少的内存,程序员自己负责在何时用freedelete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

 

23.函数模板与类模板有什么区别?
答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。

 

24. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
答:while(1){}

       loop

      goto   loop


25关键字static的作用是什么?(1)用于全局变量;(2)用于局部变量;(3)用于函数

      C语言中,关键字static有三个明显的作用:

 static全局变量只初使化一次,防止在其他文件单元中被引用;

 static局部变量只被初始化一次,下一次依据上一次结果值;

 static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝;

 

26、什么是预编译,何时需要预编译:
1、总是使用不经常改动的大型代码体。
2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。

      在这种情况下,可以将所有包含文件预编译为一个预编译头。

 

27 结构与联合有和区别?

1. 结构和联合都是由多个不同的数据类型成员组成但在任何同一时刻联合中只存放了一个被选中的成员(所有成员共用一块地址空间) 

    结构的所有成员都存在(不同成员的存放地址不同)。

2. 对于联合的不同成员赋值将会对其它成员重写原来成员的值就不存在了而对于结构的不同成员赋值是互不影响的。

 

28、简述什么是值传递,什么是地址传递,两者区别是什么?
参考答案:
      值传递主调函数传递给被调函数的是值的拷贝,不是原值;

       地址传递主调函数传递给被调函数的是值的地址。

       区别是值传递被调函数中的操作不改变主调函数的值,而地址传递则不同。


30 比较 union  struct 的不同;

    在分配空间时,union中的各个域的空间是重叠的,struct中的各个域的空间是不重叠的。

 

31、 操作系统的内存分配一般有哪几种方式,各有什么优缺点?

定长和变长。
变长:内存时比较灵活,但是易产生内存碎片。

定长:灵活性差,但分配效率较高,不会产生内存碎片。

 

32、 操作系统的致命错误有哪些?

致命错误主要包括启动配置错、内部资源耗尽和各种其它类型的不可恢复性错误。

 

32 关键字volatile在编译时有什么含义?并给出三个不同使用场景的例子(可以伪代码或者文字描述)。

volatile关键字定义变量,相当于告诉编译器,这个变量的值会随时发生变化,每次使用时都需要去内存里重新读取它的值,并不要随意针对它作优化。
建议使用volatile变量的场所:
(1) 并行设备的硬件寄存器
(2) 一个中断服务子程序中会访问到的非自动变量(全局变量)
(3) 多线程应用中被几个任务共享的变量


33) 中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别?

异常:处理器遇到编程失误,特殊情况时,必须内核处理(cpu时钟同步执行)

中断:外部硬件产生一个电信号,打断cpu的执行。


34.malloc与calloc

    malloc:直接申请空间,并不改变内存的内容

    calloc:把内存区域的空间写0;

   realloc:重新申请空间。


35、操作系统的致命错误有哪些?

   致命错误主要包括启动配置错、内部资源耗尽和各种其它类型的不可恢复性错误。


36、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。

 

二  系统编程

1、问:什么是程序?什么是进程?本质区别?

答:程序是一些指令的有序集合

    进程是程序执行的过程。

本质区别:程序是静态的,进程是动态的。

 

2、问:无名管道为什么只能在具有公共祖先的进程间通信?管道的特点?

答:管道无法打开,只能够通过继承的方法获取文件描述符。

管道的特点:

1.半双工特性,一个时间只能一个方向流通。

2.只在父子之间使用。

3.管道对于管道两端而言,只是一个文件,但是存放在内存中。

4.数据从管道的一端写入,从另一端读出。

5.没有名字。

6.管道的缓冲区是有限的。

7.管道所传送的数据是无格式的,这要求管道的读出方与写入方必须事先约定好数据的格式,如多少字节算一个消息等。

8.写入管道的数据读完之后就从管道中消失。

 

3、问:管道与消息队列的区别?

答:管道和无名管道收发数据都是先进先出的,消息队列可以实现按消息的类型随机读取。

 

5、问:有名管道相比无名管道最大的优点是什么?

答:实现不同信号之间的相互通信。

 

6、问:什么是信号量,有什么特点,简述pv操作?

答:信号量就是个计数器,计数器的值只能是非负的。

操作计数器的方法是pv操作,pv操作具有原子性(不可中断),要执行就一定要执行成功,要么就不执行。

P操作使信号量的值减一。

当进行带阻塞的p操作的时候,如果信号量的值已经是0了,p操作就会阻塞。

V操作使得信号量的值加一。

 

7.死锁的四个条件及处理方法。

进程死锁的原因:资源竞争及进程推进顺序非法

 (1)互斥条件:一个资源每次只能被一个进程使用。  
 (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。  
3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。   
4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 
  解决死锁的方法分为死锁的预防,避免,检测与恢复四种

 

8、问:什么是进程?什么是线程,它们之间的关系?实现多任务的优缺点?
答: 进程是系统资源分配的基本单位,拥有独立的资源分配。

     线程是cpu调度和分配的基本单位。

关系: 

1:一个进程中可以有多个线程,线程必须依赖于进程存在,如果进程结束了,线程也就不存在了。
2:每个进程都至少有一个线程,称为主线程。


多任务优缺点:

进程:
   优点:父子进程资源独享。
   缺点:资源开销比较大,子进程完全复制父进程的地址空间,父子进程共享数据不方便。

线程:
   优点:资源开销比较小,共享数据比较方

   缺点:资源共享,多个线程共享资源比较麻烦。

 

11、什么是“zombie”进程?在我们的程序中如何防止“zombie”进程?(试说出其中的三种方法)

僵尸进程:一个已经终止,但其父进程没有对其进行处理的子进程称为僵尸进程。

防止僵尸进程:

      1 waitpidwait)等待子进程返回.

      2)两次fork也能够实现

      

12、系统调用与库函数的关系:

  并不是所有的系统调用都被封装成库函数,系统提供的许多功能都必须通过系统调用才能完成。

 

10.进程同步机制,并比较优缺点。
  进程同步是进程之间直接的相互作用
  进程互斥是进程之间发生的一种间接性作用,一般是程序不希望的。

 

11、标准I/O提供三种类型的缓冲:

全缓冲、行缓冲、不带缓冲

 

12、linux内核有几种锁,它们有什么不同?

      Linux的内核锁主要是自旋锁和信号量。

         自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的执行线程便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的执行线程同时进入临界区。

       Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。
        
信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁。

 

13请说明C++中动态链接库和静态链接库的区别?
答:
a) 
动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,当程序运行时直接从操作系统中找,动态链接是只建立一个引用的接口,而真正的代码和数据存放在另外的可执行模块中,在运行时再装入;
b) 
静态链接就是把所有用到的函数全部链接到exe文件中,所有的代码和数据都复制到本模块中,运行时就不再需要库了。

 

14请说明调用动态链接库DLL2种方式?
答:
a) 
载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数,使得他们就像本地函数一样。这需要链接时链接那些函数所在DLL的导入库,导入库向系统提供了载入DLL时所需的信息及DLL函数定位。
b) 
运行时动态链接(run-time dynamic linking),运行时可以通过LoadLibraryLoadLibraryEx函数载入DLLDLL载入后,模块可以通过调用 GetProcAddress获取DLL函数的出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了。

15 请说明在程序中使用线程的好处是什么?
答:
a) 耗时的操作使用线程,提高应用程序响应
b) 
并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。
c) 
CPU系统中,使用线程提高CPU利用率
d) 
改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

 

16用户进程间通信主要哪几种方式?

1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。

2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。

3)信号(Signal):pv操作控制信号,实现信号的同步互斥。

4)消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺

5)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

6)信号量(semaphore):通过信号处理器控制同步与互斥。

7)套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。

 

 三、  网络编程

1TCP/IP(传输控制协议)中的TCPIP(网际协议)分别承担什么责任?

TCP负责你的应用软件(例如你的浏览器)和你的网络软件之间的通讯。

IP负责与其他计算机的通讯(发送主机的ip地址+接收主机的ip地址

TCP负责在数据被发送以前把它分装到IP ,然后在数据接受以后再组装起来。

IP负责把数据包发送到正确的目标计算机。

 例题1:在tcp/ip模型中进程到进程之间通信属于(传输)层,主机到主机属于(网络)层,设备到设备属于(数据链路)层,程序到程序属于(应用)层                                                                                                           

 

2.四层模型?七层模型?TCP/IP协议包括?

7层是:应用层,表示层、会话层,传出层(udp/tcp),网络层(IP),数据链路层(交换机),物理层(集成线(hub))

4层分别为:应用层:传输层:网络层:链路层。 

TCP/IP协议族包括(IP)、(ARP)、(ICMP)、(UDP)、(TCP)、(RIP)、Telnet、(SMTP)、DNS等协议。

 

3、请简述DNS、活动目录、域的概念。
参考答案:
DNS
:域名服务,作用是将网络域名解析成IP地址;
域:网络系统的一个安全边界,在一个域当中,计算机和用户共享一些列的安全信息。

 

4、问:select()函数的作用?

答:用于一个进程同时监听多个文件描述符,还可以设置监听超时时间。

5、问:tcpudpiphttptelnet协议分别位于TCP/IP协议哪一层?

答:tcp、udp位于传输层// 说出TCP/IP分别对应OSI七层中的哪一层传输层,网络层

        Ip协议位于网络层。

    http及telnet位于应用层。

 

6、问:路由器工作在TCP/IP协议中的那一层?

答:网络层。

 

7.端口的作用?

  端口是一个软件结构,一个端口对应一个16比特的数。服务进程通常使用一个固定的端口。

  端口标识通信的进程:作用:1、区分系统里的多进程

                           2、被客户程序或服务进程用来发送和接收信息

 

 端口号分类:知名端口号(IANA):21号非配给ftp  80号端口分配给http

            动态端口号

 

8、网络通信过程?

1、面向无连接:需携带地址(邮政系统服务的抽象)。

2、面向连接:无需地址,本质上连接是一个管道。(电话系统服务模式的抽象)。

 

8.物理地址转换成IP地址的协议?反之?

RARP(物理转IP) ARP(IP转物理) 

 

9.MAC层通信协议有哪些?

ISO2110,IEEE802,IEEE802.2 

网卡MAC是由6组什么组成的

16进制数据组成,前三组表示厂商,有IEEE来分配,并可以在细分,后三

组表示该制造商所制造的某个网络产品(如网卡)的系列号。

 

10.对WLAN的了解。

WLAN是指应用无线通信技术将计算机设备互联起来,构成可以互相通信和实现资源共享的网络体系。无线局域网本质的特点是不再使用通信电缆将计算机与网络连接起来,而是通过无线的方式连接,从而使网络的构建和终端的移动更加灵活。

 

12、问:什么是tcp协议与udp协议(提供进程间通信的能力)?他们的区别及优缺点? 

答:tcp:面向连接,可靠的传输层协议

面向连接:建立连接-->使用连接-->释放连接(虚电路)

可靠性:对包进行排序并检错,而损坏的包可以重传。

        tcp数据包包含序号和确认序号

        窗口式流量控制、慢启动和拥塞避免

(服务对象:telnet,ftp,Rlogin,STMP等)

    udp:无连接,不可靠的传输层通信协议

   面向无连接:发送数据之前不需要建立连接。

不可靠:

    不对数据包的顺序进行检查
        没有错误检测和重传机制

服务对象:

   主要用于那些面向查询——应答的服务(NFS(网络文件系统)/NTP(网络时间协议)/DNS(域名解析协议))

    

13、问:ip地址192.168.220.22属于什么IP?(IP地址:主机ID和子网ID,主机ID全为0的ip地址表示网段地址,主机ID全为1的地址广播地址

答:私有IP地址。

 

14、问:什么是大端什么是小端字节序?网络字节序是大端的还是小端的?

答: 小端:低地址存放低字节,高地址存放高字节;
     大端:相反;网络字节序是:大端。

 

15、网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻知道?

     若客户端掉线或者重新启动,服务器端会收到复位信号。

 

16、腾讯笔试题:tcp三次握手的过程,accept发生在三次握手哪个阶段?

accept发生在三次握手之后。

第一次握手:客户端发送syn(syn=j)到服务器。

第二次握手:服务器收到syn包,必须确认客户的SYNack=j+1),同时自己也发送一个ASK包(ask=k)。

第三次握手:客户端收到服务器的SYNACK包,向服务器发送确认包ACK(ack=k+1)

三次握手完成后,客户端和服务器就建立了tcp连接。这时可以调用accept函数获得此连接。

tcp面向连接的四次挥手过程:

1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。



 (2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
       这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

 

17、腾讯笔试题:用UDP协议通讯时怎样得知目标机是否获得了数据包

可以在每个数据包中插入一个唯一的ID,比如timestamp或者递增的int

发送方在发送数据时将此ID和发送时间记录在本地。

接收方在收到数据后将ID再发给发送方作为回应。

了解:
  路由(网络层):可以分割子网,广播域,提供防火墙功能。

 交换机(数据链路层):依据mac地址进行寻址。

18在子网210.27.48.21/30种有多少个可用地址?分别是什么?

可用地址是两个,一个网段地址,一个广播地址。

19SOCKET编程到底层以太网物理包要经过哪几次封装?

        SOCKET包、IP包、以太网包

20.列出3个常用网络协议使用的端口。
答:HTTP协议用80端口,FTP协议用21端口,POP3协议用110端口

 



 

0 0