最新软件类工作应聘笔试题精品.docx
《最新软件类工作应聘笔试题精品.docx》由会员分享,可在线阅读,更多相关《最新软件类工作应聘笔试题精品.docx(14页珍藏版)》请在冰豆网上搜索。
最新软件类工作应聘笔试题精品
1.static有什么用途?
(请至少说明两种)
1).限制变量的作用域
2).设置变量的存储域
2.引用与指针有什么区别?
1).引用必须被初始化,指针不必。
2).引用初始化以后不能被改变,指针可以改变所指的对象。
2).不存在指向空值的引用,但是存在指向空值的指针。
3.全局变量和局部变量在内存中是否有区别?
如果有,是什么区别?
全局变量储存在静态数据库,局部变量在堆栈
4、static全局变量与普通的全局变量有什么区别?
static局部变量和普通局部变量有什么区别?
static函数与普通函数有什么区别?
全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
static函数与普通函数作用域不同。
仅在本文件。
只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。
对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件static全局变量与普通的全局变量有什么区别:
static全局变量只初使化一次,防止在其他文件单元中被引用;static局部变量和普通局部变量有什么区别:
static局部变量只被初始化一次,下一次依据上一次结果值;static函数与普通函数有什么区别:
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
5、请找出下面代码中的所有错误
说明:
以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
1、#include"string.h"
2、main()
3、{
4、char*src="hello,world";
5、char*dest=NULL;
6、intlen=strlen(src);
7、dest=(char*)malloc(len);
8、char*d=dest;
9、char*s=src[len];
10、while(len--!
=0)
11、d++=s--;
12、printf("%s",dest);
13、return0;
14、}
答:
方法1:
intmain(){
char*src="hello,world";
intlen=strlen(src);
char*dest=(char*)malloc(len+1);//要为\0分配一个空间
char*d=dest;
char*s=&src[len-1];//指向最后一个字符
while(len--!
*d++=*s--;
*d=0;//尾部要加\0
printf("%s\n",dest);
free(dest);//使用完,应当释放空间,以免造成内存汇泄露
return0;
}
方法2:
#include
main()
{
charstr[]="hello,world";
intlen=strlen(str);
chart;
for(inti=0;i{t=str[i];str[i]=str[len-i-1];str[len-i-1]=t;}printf("%s",str);return0;}6.TCP/IP通信建立的过程怎样,端口有什么作用?三次握手,确定是哪个应用程序使用该协议7.进程和线程的差别。线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。8.列举几种进程的同步机制,并比较其优缺点。原子操作、信号量机制、自旋锁、管程、会合、分布式系统9.进程之间通信的途径共享存储系统、消息传递系统、管道:以文件系统为基础10.进程死锁的原因资源竞争及进程推进顺序非法11.死锁的4个必要条件互斥、请求保持、不可剥夺、环路12.死锁的处理鸵鸟策略、预防策略、避免策略、检测与解除死锁13.操作系统中进程调度策略有哪几种?FCFS(先来先服务),优先级,时间片轮转,多级反馈12.ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?应用层、表示层、会话层、运输层、网络层、物理链路层、物理层tcp/udp属于运输层.TCP服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。与TCP不同,UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能等。由于UDP比较简单,UDP头包含很少的字节,比TCP负载消耗少。tcp:提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好udp:不提供稳定的服务,包头小,开销小 13.分析下面的程序:voidGetMemory(char**p,intnum){ *p=(char*)malloc(num);} intmain(){ char*str=NULL; GetMemory(&str,100); strcpy(str,"hello"); free(str); if(str!=NULL) { strcpy(str,"world"); } printf("\nstris%s",str); getchar();} 问输出结果是什么?希望大家能说说原因,先谢谢了输出strisworld。free只是释放的str指向的内存空间,它本身的值还是存在的.所以free之后,有一个好的习惯就是将str=NULL.此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的,尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的,只不过。。。。。。。。楼上都说过了,最好别这么干。14.实现strcpy函数1.char* strcpy(char* strDest, const char* strSrc) 2.{ 3.ASSERT(strDest != NULL && strSrc != NULL); 4.char* strTmpD = strDest; 5.while ((*strTmpD++ = *strSrc++) != '0') 6.{ 7.} 8.return strDest; 9.} 15.strcpy和memcpy的区别(1).strcpy只能用于字符串拷贝;而memcpy是内存拷贝,可以拷贝任何类型的数据。(2).当二者都进行字符串拷贝时,strcpy遇到字符串结尾'\0'即完成;而memcpy只是内存的原样拷贝,不管遇到什么。void*mymemcpy(void*pvTo,constchar*pvFrom,size_tsize){assert((dest!=NULL)&&(src!=NULL));byte*psTo=(byte*)pvTo;byte*psFrom=(byte*)pvFrom;while(size-->0){*psTo++=*psFrom++;}eturnpvTo;}16.斐波拉契数列递归实现的方法如下:intFunct(intn){ if(n==0)return1; if(n==1)return1; retrurnFunct(n-1)+Funct(n-2);}请问,如何不使用递归,来实现上述函数?请教各位高手!解答:intFunct(intn)//n为非负整数{ inta=0; intb=1; intc; if(n==0)c=1; elseif(n==1)c=1; elsefor(inti=2;i<=n;i++)//应该n从2开始算起 { c=a+b; a=b; b=c; } returnc;}17.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#defineSECONDS_PER_YEAR(60*60*24*365)UL18.18.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。#defineMIN(A,B)((A)<=(B)(A):(B))19.预处理器标识#error的目的是什么?#error停止编译并显示错误信息20.9.嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit3。在以上两个操作中,要保持其它位不变。#defineBIT3(0x1<<3)staticinta;voidset_bit3(void){a|=BIT3;}voidclear_bit3(void){a&=~BIT3;}21.嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:int*ptr;ptr=(int*)0x67a9;*ptr=0xaa55;22.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。__interruptdoublecompute_area(doubleradius){doublearea=PI*radius*radius;printf("Area=%f",area);returnarea;}这个函数有太多的错误了,以至让人不知从何说起了:1).ISR不能返回一个值。如果你不懂这个,那么你不会被雇用的。2).ISR不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。3).在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。4).与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。代码例子(Codeexamples)23.切换目录、查看文件、重启、修改文件权限、删除文件的Linux命令2.linux基本命令重启shutdown-hnow立刻关机shutdown-rnow重启reboot重启2.1文件查看和连接命令 catcat[选项]…more 显示文件内容,带分页less显示文件内容,带分页2.2命令的操作more more[选项] …分屏显示命令lessless[选项]按页显示命令clear 清除屏幕命令history 查看历史命令记录2.3目录相关命令cd.. 可进入上一层目录cd-进入上一个进入的目录cd~ 可进入用户的home目录pwd 显示当前在哪个路径ls列出文件和目录ls-a 显示隐藏文件ls-l显示常列表格式mkdir建立目录rmdir 删除空目录touch 建立空文件2.4.1文件操作mv 移动文件和改文件将档案aaa更名为bbb: 将所有的C语言程式移至Finished子目录中: mv-i*.crm删除文件和目录rm-rf*删除所有内容(包括目录和文件)如何修改文件的访问权限chmod777along24、输入a,b,c三个整数,然后输出其中的最大值,注意算法效率a=a>b?a:b;a=a>c?a:c;25、x86处理器中,物理页面的大小是____4K____26、编译过程的五个阶段编译程序的工作过程一般也可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。27、i=i+1i++++I的区别?请高手解释一下.计算机内部实现过程有别,详细如下:i=i+1的过程相当: temp=i+1; i=temp;i++的过程相当: temp=i; i=temp+1; returntemp;++i的过程最简单: i增1然后returni的值,一步完成,没有给任何temp变量赋值:)28、进程和线程的区别?进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执、行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。29、用C语言写一个函数判断处理器的大小端?IntcheckCPU(){{unionw;{inta;charb;}c;c.a=1;return(c.b==1);}若返回0,则为大端处理器;返回1,则为小端处理器。30、写出GCC的编译过程(源文件为Hello.c)?第一步预处理 命令: gcc–EHello.c–oHello.i第二步编译及优化 命令: gcc–SHello.i-oHello.s第三步汇编 命令:gcc-cHello.s-oHello.o第四步链接 命令:gccHello.o-oHello31、计算1+2+....+100的值#include main() {printf("%d\n",fun(100));//调用函数fun()}fun(intn) //递归函数{intt; if(n==0||n==1)t=1;//如果n为0或为1输出1elset=n+fun(n-1);returnt; }
t=str[i];
str[i]=str[len-i-1];str[len-i-1]=t;
printf("%s",str);
6.TCP/IP通信建立的过程怎样,端口有什么作用?
三次握手,确定是哪个应用程序使用该协议
7.进程和线程的差别。
线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(1)调度:
线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:
不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:
进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:
在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
8.列举几种进程的同步机制,并比较其优缺点。
原子操作、信号量机制、自旋锁、管程、会合、分布式系统
9.进程之间通信的途径
共享存储系统、消息传递系统、管道:
以文件系统为基础
10.进程死锁的原因
资源竞争及进程推进顺序非法
11.死锁的4个必要条件
互斥、请求保持、不可剥夺、环路
12.死锁的处理
鸵鸟策略、预防策略、避免策略、检测与解除死锁
13.操作系统中进程调度策略有哪几种?
FCFS(先来先服务),优先级,时间片轮转,多级反馈
12.ISO的七层模型是什么?
tcp/udp是属于哪一层?
tcp/udp有何优缺点?
应用层、表示层、会话层、运输层、网络层、物理链路层、物理层
tcp/udp属于运输层.TCP服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。
与TCP不同,UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能等。
由于UDP比较简单,UDP头包含很少的字节,比TCP负载消耗少。
tcp:
提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好
udp:
不提供稳定的服务,包头小,开销小
13.分析下面的程序:
voidGetMemory(char**p,intnum)
*p=(char*)malloc(num);
intmain()
char*str=NULL;
GetMemory(&str,100);
strcpy(str,"hello");
free(str);
if(str!
=NULL)
strcpy(str,"world");
printf("\nstris%s",str);
getchar();
问输出结果是什么?
希望大家能说说原因,先谢谢了
输出strisworld。
free只是释放的str指向的内存空间,它本身的值还是存在的.所以free之后,有一个好的习惯就是将str=NULL.此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的,尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。
这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。
当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。
但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的,只不过。
。
楼上都说过了,最好别这么干。
14.实现strcpy函数
1.char* strcpy(char* strDest, const char* strSrc)
2.{
3.ASSERT(strDest !
= NULL && strSrc !
= NULL);
4.char* strTmpD = strDest;
5.while ((*strTmpD++ = *strSrc++) !
= '0')
6.{
7.}
8.return strDest;
9.}
15.strcpy和memcpy的区别
(1).strcpy只能用于字符串拷贝;而memcpy是内存拷贝,可以拷贝任何类型的数据。
(2).当二者都进行字符串拷贝时,strcpy遇到字符串结尾'\0'即完成;而memcpy只是内存的原样拷贝,不管遇到什么。
void*mymemcpy(void*pvTo,constchar*pvFrom,size_tsize)
assert((dest!
=NULL)&&(src!
=NULL));
byte*psTo=(byte*)pvTo;
byte*psFrom=(byte*)pvFrom;
while(size-->0)
*psTo++=*psFrom++;
eturnpvTo;
16.斐波拉契数列递归实现的方法如下:
intFunct(intn)
if(n==0)return1;
if(n==1)return1;
retrurnFunct(n-1)+Funct(n-2);
请问,如何不使用递归,来实现上述函数?
请教各位高手!
解答:
intFunct(intn)//n为非负整数
inta=0;
intb=1;
intc;
if(n==0)c=1;
elseif(n==1)c=1;
elsefor(inti=2;i<=n;i++)//应该n从2开始算起
c=a+b;
a=b;
b=c;
returnc;
17.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#defineSECONDS_PER_YEAR(60*60*24*365)UL
18.
18.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
#defineMIN(A,B)((A)<=(B)(A):
(B))
19.预处理器标识#error的目的是什么?
#error停止编译并显示错误信息
20.9.嵌入式系统总是要用户对变量或寄存器进行位操作。
给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit3。
在以上两个操作中,要保持其它位不变。
#defineBIT3(0x1<<3)
staticinta;
voidset_bit3(void)
a|=BIT3;
voidclear_bit3(void)
a&=~BIT3;
21.嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。
在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。
编译器是一个纯粹的ANSI编译器。
写代码去完成这一任务。
这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。
这一问题的实现方式随着个人风格不同而不同。
典型的类似代码如下:
int*ptr;
ptr=(int*)0x67a9;
*ptr=0xaa55;
22.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。
具代表事实是,产生了一个新的关键字__interrupt。
下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interruptdoublecompute_area(doubleradius)
doublearea=PI*radius*radius;
printf("Area=%f",area);
returnarea;
这个函数有太多的错误了,以至让人不知从何说起了:
1).ISR不能返回一个值。
如果你不懂这个,那么你不会被雇用的。
2).ISR不能传递参数。
如果你没有看到这一点,你被雇用的机会等同第一项。
3).在许多的处理器/编译器中,浮点一般都是不可重入的。
有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。
此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
4).与第三点一脉相承,printf()经常有重入和性能上的问题。
如果你丢掉了第三和第四点,我不会太为难你的。
不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。
代码例子(Codeexamples)
23.切换目录、查看文件、重启、修改文件权限、删除文件的Linux命令
2.linux基本命令
重启
shutdown-hnow立刻关机
shutdown-rnow重启
reboot重启
2.1文件查看和连接命令
catcat[选项]…
more 显示文件内容,带分页
less显示文件内容,带分页
2.2命令的操作
more more[选项] …分屏显示命令
lessless[选项]按页显示命令
clear 清除屏幕命令
history 查看历史命令记录
2.3目录相关命令
cd.. 可进入上一层目录
cd-进入上一个进入的目录
cd~ 可进入用户的home目录
pwd 显示当前在哪个路径
ls列出文件和目录
ls-a 显示隐藏文件
ls-l显示常列表格式
mkdir建立目录
rmdir 删除空目录
touch 建立空文件
2.4.1文件操作
mv 移动文件和改文件将档案aaa更名为bbb:
将所有的C语言程式移至Finished子目录中:
mv-i*.c
rm删除文件和目录
rm-rf*删除所有内容(包括目录和文件)
如何修改文件的访问权限
chmod777along
24、输入a,b,c三个整数,然后输出其中的最大值,注意算法效率
a=a>b?
a:
b;
a=a>c?
c;
25、x86处理器中,物理页面的大小是____4K____
26、编译过程的五个阶段
编译程序的工作过程一般也可以划分为五个阶段:
词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。
27、i=i+1i++++I的区别?
请高手解释一下.
计算机内部实现过程有别,详细如下:
i=i+1的过程相当:
temp=i+1; i=temp;
i++的过程相当:
temp=i; i=temp+1; returntemp;
++i的过程最简单:
i增1然后returni的值,一步完成,没有给任何temp变量赋值:
)
28、进程和线程的区别?
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
进程有独立的地址空间,
一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执
、行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉
就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资
源较大,效率要差一些。
但对于一些要求同时进行并且又要共享某些变量的并发操作,只能
用线程,不能用进程。
29、用C语言写一个函数判断处理器的大小端?
IntcheckCPU()
{
unionw;
inta;
charb;
}c;
c.a=1;
return(c.b==1);
若返回0,则为大端处理器;返回1,则为小端处理器。
30、写出GCC的编译过程(源文件为Hello.c)?
第一步预处理
命令:
gcc–EHello.c–oHello.i
第二步编译及优化
命令:
gcc–SHello.i-oHello.s
第三步汇编
gcc-cHello.s-oHello.o
第四步链接
gccHello.o-oHello
31、计算1+2+....+100的值
printf("%d\n",fun(100));//调用函数fun()
fun(intn) //递归函数
intt;
if(n==0||n==1)
t=1;//如果n为0或为1输出1
elset=n+fun(n-1);
returnt;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1