C语言常见笔试题及答案.docx
- 文档编号:4889320
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:41
- 大小:36.46KB
C语言常见笔试题及答案.docx
《C语言常见笔试题及答案.docx》由会员分享,可在线阅读,更多相关《C语言常见笔试题及答案.docx(41页珍藏版)》请在冰豆网上搜索。
C语言常见笔试题及答案
c语言常见笔试题总结
c语言笔试题(九)
2006-09-06
Tag:
C语言
1.
#include"stdio.h"
intmain()
{
inta;
int*p;
p=&a;
*p=0x500;
a=(int)(*(&p));
a=(int)(&(*p));
if(a==(int)p)
printf("equal!
\n");
else
printf("notequal!
\n");
}
请问本程序的输出显示是什么?
答案:
输出显示为”equal!
”
2.
struct{
signedintbit0:
1;
signedintbit1:
1;
signedintbit2:
1;
signedintbit3:
1;
signedintbit4:
1;
signedintbit5:
1;
signedintbit6:
1;
signedintbit7:
1;
}bits;
请问sizeof(bits)是否是正确的表达式?
请问语句bitsmybits;的定义是否正确?
如果不正确,要如何修改上述的结构定义才能使该语句正确?
修改后的结构定义是否会影响sizeof(bits)的正确性?
如果正确则该表达式的值为多少?
如果将上述的结构中int类型改为char类型,此时sizeof(bits)的大小为多少?
答案:
1)是正确的表达式,因为sizeof后面的内容可以是类型,也可以是变量。
2)该语句的定义不正确,因为此时的bits为一个变量;应该这样修改结构的定义
typedefstruct{
signedintbit0:
1;
signedintbit1:
1;
signedintbit2:
1;
signedintbit3:
1;
signedintbit4:
1;
signedintbit5:
1;
signedintbit6:
1;
signedintbit7:
1;
}bits;
修改后sizeof(bits)表达式依然正确,其值为4;类型改为char后其值为1,注意该值是在VC环境中的32位程序中得到的值,在不同的编译器其值有可能不同,因此在编程时不能自己假定类似结构的大小。
3.
structbit{
unsignedinta[0]:
1,a[1]:
1,a[2]:
1….a[7]:
1;
}
请问这种写法是否正确?
为什么?
答案:
不正确,位域中的变量不能是数组。
4.
structa{
intx;
chary;
structaz;
structa*p;
}
请问这种定义结构正确否?
如果有问题,问题在哪里?
答案:
结构中不能对定义结构本身的非指针变量
如果编译器支持则会导致无限嵌套,因此一般编译器都会认为structa是未定义的类型,即使提前声明也不会有任何用处。
5.什么是可重入函数?
C语言中写可重入函数,应注意的事项?
答案:
可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果的正确性的函数。
在编写可重入函数时通常要注意如下的一些问题:
尽量不要使用全局变量,静态变量,如果使用了应该注意对变量访问的互斥。
通常可以根据具体的情况采用:
信号量机制,关调度机制,关中断机制等方式来保证函数的可重入性。
不要调用不可重入的函数,调用了不可重入的函数会使该函数也变为不可重入的函数。
注意对系统中的临界资源,互斥资源的访问方式,防止使函数成为不可重入的函数。
一般驱动程序都是不可重入的函数,因此在编写驱动程序时一定要注意重入的问题。
7.printf(“%d%d\n”,++n,power(2,n));其中power(2,n)为实现一定功能的函数如2^n。
请问这种表示方法有什么潜在的问题?
答案:
编译器的不同,对++n和power(2,n)处理的先后顺序不一样,形成二义性,造成程
序的移植性差,因此最好把++n写在printf函数外面,以消除二义性。
printf(s);
请问这样的语句有没有问题?
(s为一指向有效字符串的指针)
答案:
没有%的话,可以这样表达,如果有%在s中的话,有意想不到的输出结果。
9.两段代码共存于一个文件,编译时有选择的编译其中的一部分,请问如何实现?
答案:
有两种简单的办法可以实现:
在源码中使用条件编译语句,然后在程序文件中定义宏的形式来选择需
要的编译代码。
在源码中使用条件编译语句,然后在编译命令的命令中加入宏定义命令
来实现选择编译。
10.数据结构指针传给函数,函数能访问数据单元,但不能修改实际的内容,如何实现?
答案:
定义为指向常量的指针,这样指针所指的数据结构中的内容就不会被改变。
如:
const类型*p或类型const*p
11.在头文件中定义静态变量,可能产生什么问题?
答案:
在使用了该头文件的每个c程序文件中都单独存在一个该静态变量,这样造成空间的浪费并且很容易引起错误。
因此建议不要在头文件中定义任何变量。
12.malloc()与calloc()的区别?
答案:
1)参数上的区别
malloc(size_tsize);
calloc(size_tn,size_tsize);
malloc分配一块size大小的内存块,而calloc分配一个n*size大小的内存块
2)返回内存块的状态不同
malloc分配的内存块没有被清零,而calloc分配的内存块是清了零的。
但是建议在使用内存时,如果需要初始化,则最好自己按照需要来进行初试化,不要依赖函数的实现说明。
13.寄存器变量可不可以访问其地址?
可否是全局变量?
在什么场合使用寄存器变量?
答案:
这些问题都与编译器的实现有关,建议不要声明全局变量为寄存器变量,即使是局部变量都最好不要声明其为寄存器变量,现在的编译器在优化时都会较为合理的安排寄存器变量的使用,而人为的安排有时会造成优化的低效。
14."\n"'\n'的区别?
答案:
前者是一个字符串并且以’/0’结束,而后者只是一个简单的字符。
15.包含预定义头文件<>和""的区别?
答案:
<>只在指定的标准库目录里寻找被包含文件;""先在当前目录下查找,再在指定目录下查找;通常<>方式用于系统的头文件,而一般用户的头文件用""的方式。
16.struntS_A{
inta[10];
};
voidf()
{
inti;
struntS_A*s_ptr;
for(i=0,i<10,i++)
s_ptr->a[i]=i;
}
请问这段代码正确否?
答案:
这段代码不正确,没有对s_ptr指针进行初始化,在编程中要注意此类低级错误的发生。
c语言笔试题(八)
2006-09-06
Tag:
C语言
#pragmapack(8)
structs1{
shorta;
longb;
};
structs2{
charc;
s1d;
longlonge;
};
#pragmapack()
问
1.sizeof(s2)=?
2.s2的s1中的a后面空了几个字节接着是b?
如果您知道答案请在讨论中写出,以下是部份网友的答案,供参考:
网友rwxybh(行云)的答案:
内存布局是
1***11**
1111****
11111111
所以答案就是24和3
下面是一个测试的程序,试一试就知道了,我用的是VC2005
#pragmapack(8)
structs1{
shorta;//2BYtes
longb;//4Bytes
};
structs2{
charc;//1Byte
s1d;//8Bytes
longlonge;//8Bytes
};
//1***11**
//1111****
//11111111
//
//0001020304050607
//0001020304050607
//0001020304050607
//
#pragmapack()
intmain(intargc,char*argv[])
{
s2a;
char*p=(char*)&a;
for(inti=0;i<24;++i)
p[i]=(char)(i%8);
printf("%d\n",sizeof(a));
printf("c=0x%lx\n",a.c);
printf("d.a=0x%x\n",a.d.a);
printf("d.b=0x%x\n",a.d.b);
printf("e=0x%llx\n",a.e);
return0;
}
结果:
24
c=0x0
d.a=0x504
d.b=0x3020100
e=0x706050403020100
网友redleaves(ID最吊的网友)的答案和分析:
如果代码:
#pragmapack(8)
structS1{
chara;
longb;
};
structS2{
charc;
structS1d;
longlonge;
};
#pragmapack()
sizeof(S2)结果为24.
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;
S2中,c和S1中的a一样,按1字节对齐,而d是个结构,它是8个字节,它按什么对齐呢?
对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节.
ab
S1的内存布局:
11**,1111,
cS1.aS1.bd
S2的内存布局:
1***,11**,1111,****11111111
这里有三点很重要:
1.每个成员分别按自己的方式对齐,并能最小化长度
2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度
3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐
网友xue23(xue23)的答案和分析:
有程序查一下各个变量的内存地址得知:
各个变量在内存中的位置为
c***aa**
bbbb****
dddddddd
测试代码为:
s2ss;
cout<<"ss.c="<<&ss< cout<<"ss.d.a="<<&ss.d.a< cout<<"ss.d.b="<<&(ss.d.b)< cout<<"ss.d="<<&ss.e< printout各个变量的内存地址不就可以看出来了吗。 所以答案是24,2. 但是我的想像中应该是这样的分布情况: c******* aa**bbbb dddddddd 不知为什么会c和a放在一起,组成8位长度。 coon@23: 35: 17|阅读全文|评论0|引用0|编辑 c语言笔试题(七) 2006-09-06 Tag: C语言 找错 Voidtest1() { charstring[10]; char*str1="0123456789"; strcpy(string,str1); } Voidtest2() { charstring[10],str1[10]; for(I=0;I<10;I++) { str1[i]='a'; } strcpy(string,str1); } Voidtest3(char*str1) { charstring[10]; if(strlen(str1)<=10) { strcpy(string,str1); } } 2.找错 #defineMAX_SRM256 DSNget_SRM_no() { staticintSRM_no; intI; for(I=0;I{ SRM_no%=MAX_SRM; if(MY_SRM.state==IDLE) { break; } } if(I>=MAX_SRM) return(NULL_SRM); else returnSRM_no; } 3.写出程序运行结果 intsum(inta) { autointc=0; staticintb=3; c+=1; b+=2; return(a+b+C); } voidmain() { intI; inta=2; for(I=0;I<5;I++) { printf("%d,",sum(a)); } } 4. intfunc(inta) { intb; switch(a) { case1: 30; case2: 20; case3: 16; default: 0 } returnb; } 则func (1)=? 5: inta[3]; a[0]=0;a[1]=1;a[2]=2; int*p,*q; p=a; q=&a[2]; 则a[q-p]=? 6. 定义int**a[3][4],则变量占有的内存空间为: _____ 7. 编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。 如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。 coon@23: 34: 38|阅读全文|评论0|引用0|编辑 c语言笔试题(六) 2006-09-06 Tag: C语言 4.static有什么用途? (请至少说明两种) 1.限制变量的作用域 2.设置变量的存储域 7.引用与指针有什么区别? 1)引用必须被初始化,指针不必。 2)引用初始化以后不能被改变,指针可以改变所指的对象。 2)不存在指向空值的引用,但是存在指向空值的指针。 8.描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性 13.冒泡排序算法的时间复杂度是什么? O(n^2) 16.Internet采用哪种网络协议? 该协议的主要层次结构? tcp/ip应用层/传输层/网络层/数据链路层/物理层 17.Internet物理地址和IP地址转换采用什么协议? ARP(AddressResolutionProtocol)(地址解析協議) 18.IP地址的编码分为哪俩部分? IP地址由两部分组成,网络号和主机号。 不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。 2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。 写出C程序。 循环链表,用取余操作做 3.不能做switch()的参数类型是: switch的参数不能为实型。 5、写出下列代码的输出内容 #include intinc(inta) { return(++a); } intmulti(int*a,int*b,int*c) { return(*c=*a**b); } typedefint(FUNC1)(intin); typedefint(FUNC2)(int*,int*,int*); voidshow(FUNC2fun,intarg1,int*arg2) { INCp=&inc; inttemp=p(arg1); fun(&temp,&arg1,arg2); printf("%d\n",*arg2); } main() { inta; show(multi,10,&a); return0; } 答: 110 9.unsignedchar*p1; unsignedlong*p2; p1=(unsignedchar*)0x801000; p2=(unsignedlong*)0x810000; 请问p1+5=; p2+5=; 三.选择题: 1.Ethternet链接到Internet用到以下那个协议? A.HDLC;B.ARP;C.UDP;D.TCP;E.ID 2.属于网络层协议的是: A.TCP;B.IP;C.ICMP;D.X.25 3.Windows消息调度机制是: A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈; 4.unsignedshorthash(unsignedshortkey) { return(key>>)%256 } 请问hash(16),hash(256)的值分别是: A.1.16;B.8.32;C.4.16;D.1.32 四.找错题: 1.请问下面程序有什么错误? inta[60][250][1000],i,j,k; for(k=0;k<=1000;k++) for(j=0;j<250;j++) for(i=0;i<60;i++) a[i][j][k]=0; 把循环语句内外换一下 2.#defineMax_CB500 voidLmiQueryCSmd(StructMSgCB*pmsg) { unsignedcharucCmdNum; ...... for(ucCmdNum=0;ucCmdNum { ......; } 死循环 3.以下是求一个数的平方的程序,请找出错误: #defineSQUARE(a)((a)*(a)) inta=5; intb; b=SQUARE(a++); 4.typedefunsignedcharBYTE intexamply_fun(BYTEgt_len;BYTE*gt_code) { BYTE*gt_buf; gt_buf=(BYTE*)MALLOC(Max_GT_Length); ...... if(gt_len>Max_GT_Length) { returnGT_Length_ERROR; } ....... } 五.问答题: 1.IPPhone的原理是什么? IPV6 2.TCP/IP通信建立的过程怎样,端口有什么作用? 三次握手,确定是哪个应用程序使用该协议 3.1号信令和7号信令有什么区别,我国某前广泛使用的是那一种? 4.列举5种以上的电话新业务? 微软亚洲技术中心的面试题! ! ! 1.进程和线程的差别。 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度: 线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2)并发性: 不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行 (3)拥有资源: 进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. (4)系统开销: 在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。 2.测试方法 人工测试: 个人复查、抽查和会审 机器测试: 黑盒测试和白盒测试 2.Heap与stack的差别。 Heap是堆,stack是栈。 Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。 Stack空间有限,Heap是很大的自由存储区 C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。 程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行 3.Windows下的内存是如何管理的? 4.介绍.Net和.Net的安全性。 5.客户端如何访问.Net组件实现WebService? 6.C/C++编译器中虚表是如何完成的? 7.谈谈COM的线程模型。 然后讨论进程内/外组件的差别。 8.谈谈IA32下的分页机制 小页(4K)两级分页模式,大页(4M)一级 9.给两个变量,如何找出一个带环单链表中是什么地方出现环的? 一个递增一,一个递增二,他们指向同一个接点时就是环出现的地方 10.在IA32中一共有多少种办法从用户态跳到内核态? 通过调用门,从ring3到ring0,中断从ring3到ring0,进入vm86等等 11.如果只想让程序有一个实例运行,不能运行两个。 像winamp一样,只能开一个窗口,怎样实现? 用内存映射或全局原子(互斥变量)、查找窗口句柄.. FindWindow,互斥,写标志到文件或注册表,共享内存。 . 12.如何截取键盘的响应,让所有的‘a’变成‘b’? 键盘钩子SetWindowsHookEx 13.Apartment在COM中有什么用? 为什么要引入? 14.存储过程是什么? 有什么用? 有什么优点? 我的理解就是一堆sql的集合,可以建立非常复杂的查询,编译运行,所以运行一次后,以后再运行速度比单独执行SQL快很多 15.Template有什么特点? 什么时候用? 16.谈谈WindowsDNA结构的特点和优点。 网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别? 1,进程: 子进程是父进程的复制品。 子进程获得父进程数据空间、堆和栈的复制品。 2,线程: 相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 两者都可以提高程序的并发度,提高程序运行效率和响应时间。 线程和进程在使用上各有优缺点: 线程执行开销小,但不利于资源管理和保护;而进程正相反。 同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。 思科 1.用宏定义写出swap(x,y) #def
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 常见 笔试 答案