《2022年C语言经典笔试面试题 .pdf》由会员分享,可在线阅读,更多相关《2022年C语言经典笔试面试题 .pdf(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、学而不思则惘,思而不学则殆1、Static作用:限制变量的作用域;设置变量的存储域;1) 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用; 即:把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。2、进程、线程:定义: 一、进程是具有一定独立功
2、能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。二、线程是进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位, 线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程;进程和线程的关系:(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。(3)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。(4)处理机分给线程,即真正在处理机上运行的是线程。
3、(5)线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。(4)系统开销:在创建或撤销进程的时候,由于系统都要为之分配和回收资源,导致系统的明显大于创建或撤销线程时的开销。但进程有独立的地址空间,进程崩溃后, 在保护模式下不会对其他的进程产生影响,而线程只是一个进程中的不同的执行路径。线程有自己的堆栈和局部变量, 但线程之间没有单独的
4、地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但是在进程切换时,耗费的资源较大,效率要差些。线程的划分尺度小于进程,使得多线程程序的并发性高。另外, 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大的提高了程序运行效率。线程在执行过程中,每个独立的线程有一个程序运行的入口,顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,有应用程序提供多个线程执行控制。从逻辑角度看, 多线程的意义子啊与一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和
5、线程的重要区别。3、进程状态:三态:运行、就绪和阻塞态名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 1 页,共 8 页 - - - - - - - - - 学而不思则惘,思而不学则殆五态:运行、就绪和阻塞态,加上新建态和终止态3、进程间通信:# 管道 ( pipe ) :管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是
6、它允许无亲缘关系进程间的通信。# 信号量 ( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。 它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。# 消息队列 ( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。 消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。# 共享内存 ( shared memor
7、y ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。# 套接字 ( socket ) : 套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。4、gcc :预处理、编译、汇编、链接gcc -c hello.c -o hello.o (-o为产生的可执行文件指定文件名) -c 选项告诉GCC仅把源代码编译为目标代码。缺省时GCC建立的目标代码文件有一个.o的扩展名
8、。 -g (gdb) 显示调试信息 . 5、GDB:有文件 TXT.c 编译生成执行文件:(Linux下)hchen/test gcc -g tst.c -o tst 使用 GDB调试:hchen/test gdb tst - 启动 GDB (gdb) l - l 命令相当于list,从第一行开始例出原码。(gdb) break 16 - 设置断点,在源程序第16 行处。(gdb) break func - 设置断点,在函数func()入口处。(gdb) info break - 查看断点信息。(gdb) run - 运行程序, run命令简写(gdb) next - 在断点处停住。(gdb)
9、 n - 单条语句执行,next命令简写。(gdb) continue - 继续运行程序, continue命令简写。(gdb) quit - 退出调试;6、Makefile:名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 2 页,共 8 页 - - - - - - - - - 学而不思则惘,思而不学则殆Makefile的规则目标 : 需要的条件(注意冒号两边有空格)命令(注意前面用tab键开头)Makefile 有三个非常有用的变量:$ , $ ,$。其意义为:$
10、:目标文件$ :所有的依赖文件$ 物理内存页帧的个数,岂不是有些虚拟内存页的地址永远没有对应的物理内存地址空间?不是的,操作系统是这样处理的。操作系统有个页面失效(page fault)功能。 操作系统找到一个最少使用的页帧,让他失效,并把它写入磁盘,随后把需要访问的页放到页帧中,并修改页表中的映射,这样就保证所有的页都有被调度的可能了。这就是处理虚拟内存地址到物理内存的步骤。现在来回答什么是虚拟内存地址和物理内存地址。虚拟内存地址由页号(与页表中的页号关联)和偏移量组成。页号就不必解释了,上面已经说了,页号对应的映射到一个页帧。那么,说说偏移量。偏移量就是我上面说的页(或者页帧)的大小,即这
11、个页(或者页帧)到底能存多少数据。举个例子,有一个虚拟地址它的页号是4,偏移量是20,那么他的寻址过程是这样的: 首先到页表中找到页号4 对应的页帧号 (比如为 8),如果页不在内存中,则用失效机制调入页,否则把页帧号和偏移量传给MMU(CPU 的内存管理单元)组成一个物理上真正存在的地址,接着就是访问物理内存中的数据了。总结起来说, 虚拟内存地址的大小是与地址总线位数相关,物理内存地址的大小跟物理内存条的容量相关。名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 5
12、 页,共 8 页 - - - - - - - - - 学而不思则惘,思而不学则殆19 、哈希表:若结构中存在和关键字K 相等的记录, 则必定在f(K)的存储位置上。 由此, 不需比较便可直接取得所查记录。称这个对应关系f 为散列函数 (Hash function) ,按这个思想建立的表为散列表。20 、处理哈希冲突的方法1、开放寻址法;2、拉链法拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m 个头指针组成的指针数组 T0.m-1 。凡是散列地址为i 的结点,均插入到以Ti为头指针的单链表中。T 中各分量的初值均应为空指
13、针。在拉链法中,装填因子可以大于1,但一般均取1。【例】设有m 5 , H(K) K mod 5 ,关键字值序例5 , 21 , 17 , 9 , 15, 36 , 41 , 24 ,按外链地址法所建立的哈希表如下图所示:21 、哈希函数 : 22 、二叉树中序遍历算法#include #include #define maxsize 100 typedef char elemtype; typedef struct Node elemtype data; struct Node *lchild; struct Node *rchild; BitNode; void CreatBiTree(B
14、itNode *&b,char *str) BitNode *stmaxsize,*p=NULL; int top=-1,k,j=0; char ch; b=NULL; ch=strj; while(ch!=0) switch(ch) case(:top+;sttop=p;k=1;break; case):top-;break; case,:k=2;break; default:p=(BitNode *)malloc(sizeof(BitNode); p-data=ch; p-lchild=p-rchild=NULL; if(b=NULL) b=p; else switch(k) case 1
15、:sttop-lchild=p;break; case 2:sttop-rchild=p;break; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 6 页,共 8 页 - - - - - - - - - 学而不思则惘,思而不学则殆j+; ch=strj; BitNode *Find(BitNode *b,elemtype x) BitNode *p; if(b=NULL) return NULL; else if(b-data=x) return b; else
16、 p=Find(b-lchild,x); if(p!=NULL) return p; else return Find(b-rchild,x); BitNode *Lchild(BitNode *b) return b-lchild; BitNode *rchild(BitNode *b) return b-rchild; int BiTreeDepth(BitNode *b) /* 初始条件 : 二叉树 T 存在。操作结果 : 返回 T的深度 */ int i,j; if(!b) return 0; if(b-lchild) i=BiTreeDepth(b-lchild); /递归求左子树的
17、深度 else i=0; if(b-rchild) j=BiTreeDepth(b-rchild); /递归求右子树的深度 else j=0; return ij?i+1:j+1; /取深度值大者加1 作为该树的深度 void Visit(char ch) printf(%c ,ch); /* 先序遍历二叉树 */ void PreOrder(BitNode *b) if (b!=NULL) Visit(b-data); PreOrder(b-lchild); PreOrder(b-rchild); /* 中序遍历二叉树 */ void InOrder(BitNode *b) if (b!=
18、NULL) InOrder(b-lchild); Visit(b-data); InOrder(b-rchild); /* 后序遍历二叉树 */ void PostOrder(BitNode *b) if(b!= NULL) PostOrder(b-lchild); PostOrder(b-rchild); Visit(b-data); void main() BitNode *b,*p,*lp,*rp; printf(1)用孩子链式储存结构创建二叉树); 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - -
19、- - - - - - - - - 第 7 页,共 8 页 - - - - - - - - - 学而不思则惘,思而不学则殆CreatBiTree(b,A(B(D,E(H(J,K(L,M(,N),C(F,G(,I); printf(n(2)输出 H 结点的左右孩子); p=Find(b,H); if(p!=NULL) lp=Lchild(p); if(lp!=NULL) printf(左孩子为 :%c,lp-data); else printf(无左孩子 ); rp=rchild(p); if(rp!=NULL) printf(右孩子为 :%c,rp-data); else printf(无右孩子 ); printf(n); printf(3)二叉树 b 的深度为:%dn,BiTreeDepth(b); printf(4)先序遍历序列为 :); PreOrder(b); printf(n(5)中序遍历序列为:); InOrder(b); printf(n(6)后序遍历序列为:); PostOrder(b); printf(n);名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 8 页,共 8 页 - - - - - - - - -
限制150内