C语言笔试题-C笔试题大全14-附答案(共20页).doc
精选优质文档-倾情为你奉上c语言常见笔试题总结【1 使用宏】 1.1 #error的作用? #error用于向编译器报错,并输出它后面带的错误信息。例如: #ifndef SOMETHING #error SOMETHING not defined! #endif 如果在这段代码之前未定义过SOMETHING,则在编译时出错,并给出"SOMETHING not defined!"的错误信息。 1.2 定义一个宏,求出给定数组中的元素的个数 #define NELEMENTS(array) (sizeof(array) / sizeof(array)0) 【2 数据声明和定义】 给定以下类型的变量a的定义式: a) An integer int a;b) A pointer to an integer int *a;c) A pointer to a pointer to an integer int *a;d) An array of 10 integers int a10;e) An array of 10 pointers to integers int *a10;f) A pointer to an array of 10 integers int (*a)10;g) A pointer to a <I>function</I> that takes an integer as an argument and returns an integer int (*a)(int );h) An array of ten pointers to <I>function</I>s that take an integer argument and return an integer int (*a10 ) (int );【3 复杂类型(1)】 有如下表达式: char (*(*x()(); 请用文字描述x是什么。 首先,确定标识符:x x是一个函数,没有参数:x() 返回值是一个指针:*x() 这个指针指向一个数组:(*x() 数组中的每个元素是指针:*(*x() 指向一个不带参数的函数:(*(*x()() 函数的返回值是char:char (*(*x()() 这里,要知道*、()和的优先级【5 头文件】 问:为什么标准头文件都有类似以下的结构? #ifndef _INCvxWorksh #define _INCvxWorksh #ifdef _cplusplus extern "C" #endif /*.*/ #ifdef _cplusplus #endif #endif 在编译源文件时,C编译器和C+编译器都会对符号(函数或变量)名作某些修正,但两者采用的修正方法不同,所以两者生成的目标文件不能互相链接。在C+ +中使用extern "C"可以让C+符号获得C链接特性。由于C+编译器会自动定义_cplusplus宏,所以在C语言头文件中采用这种结构可以保证无论使用何种编译器,生成的目标文件都具有C链接特性,能够与标准C编译器所生成的目标文件相链接【6 static关键字】 请说出static关键字的3种用处:(1)用于全局变量;外部静态变量,只能在本源文件中被引用,不能被其它源文件所引用。(2)用于局部变量;局部静态变量,在函数返回后存储单元不释放;下一次调用该函数时,该变量为上次函数返回时的值。(3)用于函数。内部函数,只能被本源文件中的函数所调用,不能被其它源文件调用。/* file.c */static int a;int b; static int fn()static int x;int y; 【7 const关键字】 7.1 const关键字的意义是什么?7.2 解释以下的变量定义: const int a1; a1是整型常量。int const a2; a2是整型常量。等同于const int a2。const int *a3; a3是指针(a3是可变的),指向一个整型常量。等同于int const *a3。int * const a4; a4是常量指针(a4不可变),指向一个整型变量。int const * const a5; a5是常量指针(a5不可变),指向一个整型常量。等同于const int * const a5。【8 volatile关键字】 8.1 volatile意义?volatile int *p; 8.2 volatile能和const一起使用吗?const关键字的意思是限制编程者自己不能修改变量的值;两者并不矛盾。 例如一个内存映射的、只读的硬件寄存器,假设它的地址是p,则可以这样声明:volatile const UINT32 *p;【9 sizeof()】 有以下定义: char *pmsg = "A" char msg = "A" char ch = 'A' 问:sizeof(pmsg) = ?4sizeof(msg) = ?2sizeof(“A”) = ?2sizeof(ch) = ?1sizeof(A) = ?(在C+中等于多少?)(在C语言中,字符常量的数据类型实际上是int;在C+中,它的数据类型是char,从而原式等于1) void f(char param100)/ sizeof(param) = ?4 【10 字符串】 有以下代码 char *pmsg = "hello, world!" strcpy(pmsg, "hi, there."); 试评论该代码。 【11 混合运算】 有以下代码: void foo()unsigned int a = 6;int b = -20;(a+b > 6) ? puts("> 6") : puts(" < = 6"); 请问调用foo()的输出? c语言笔试题(九)1struct signed int bit0:1; signed int bit1:1; signed int bit2:1; signed int bit3:1; signed int bit4:1; signed int bit5:1; signed int bit6:1; signed int bit7:1;bits;请问sizeof(bits)是否是正确的表达式?请问语句bits mybits; 的定义是否正确?如果不正确,要如何修改上述的结构定义才能使该语句正确?修改后的结构定义是否会影响sizeof(bits)的正确性?如果正确则该表达式的值为多少?如果将上述的结构中int类型改为char类型,此时sizeof(bits)的大小为多少?答案:1)是正确的表达式,因为sizeof后面的内容可以是类型,也可以是变量。2)该语句的定义不正确,因为此时的bits为一个变量;应该这样修改结构的定义typedef struct signed int bit0:1; signed int bit1:1; signed int bit2:1; signed int bit3:1; signed int bit4:1; signed int bit5:1; signed int bit6:1; signed int bit7:1;bits;修改后sizeof(bits)表达式依然正确,其值为4;类型改为char后其值为1,注意该值是在VC环境中的32位程序中得到的值,在不同的编译器其值有可能不同,因此在编程时不能自己假定类似结构的大小。3 struct bit unsigned int a0:1,a1:1,a2:1.a7:1; 请问这种写法是否正确?为什么?答案:不正确,位域中的变量不能是数组。4struct a int x; char y; struct a z; struct a *p; 请问这种定义结构正确否? 如果有问题,问题在哪里?答案:结构中不能对定义结构本身的非指针变量,如果编译器支持则会导致无限嵌套,因此一般编译器都会认为struct a是未定义的类型,即使提前声明也不会有任何用处。5 什么是可重入函数?C语言中写可重入函数,应注意的事项?答案:可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果的正确性的函数。在编写可重入函数时通常要注意如下的一些问题:尽量不要使用全局变量,静态变量,如果使用了应该注意对变量访问的互斥。通常可以根据具体的情况采用:信号量机制,关调度机制,关中断机制等方式来保证函数的可重入性。不要调用不可重入的函数,调用了不可重入的函数会使该函数也变为不可重入的函数。注意对系统中的临界资源,互斥资源的访问方式,防止使函数成为不可重入的函数。一般驱动程序都是不可重入的函数,因此在编写驱动程序时一定要注意重入的问题。6 简述stack frame 的含义。答案:stack frame的中文译名为:栈框架,表示函数在栈空间的调用层次, 7 printf (“%d%dn”,+n, power(2,n); 其中power(2,n)为实现一定功能的函数 如 2n 。 请问这种表示方法有什么潜在的问题? 答案:编译器的不同,对+n 和power(2,n)处理的先后顺序不一样,形成二义性,造成程序的移植性差,因此最好把+n 写在printf函数外面,以消除二义性。8. printf (s); 请问这样的语句有没有问题?(s为一指向有效字符串的指针) 答案:没有%的话,可以这样表达,如果有%在s中的话,有意想不到的输出结果。9 两段代码共存于一个文件,编译时有选择的编译其中的一部分,请问如何实现?答案:有两种简单的办法可以实现:在源码中使用条件编译语句,然后在程序文件中定义宏的形式来选择需要的编译代码。在源码中使用条件编译语句,然后在编译命令中加入宏定义命令来实现选择编译。10数据结构指针传给函数,函数能访问数据单元,但不能修改实际的内容,如何实现?答案:定义为指向常量的指针,这样指针所指的数据结构中的内容就不会被改变。如: const 类型 *p 或 类型 const *p 11 在头文件中定义静态变量,可能产生什么问题? 答案:在使用了该头文件的每个c程序文件中都单独存在一个该静态变量,这样造成空间的浪费并且很容易引起错误。因此建议不要在头文件中定义任何变量。12malloc()与 calloc()的区别?答案: 1)参数上的区别malloc (size_t size);calloc (size_t n , size_t size);malloc分配一块size大小的内存块,而calloc分配一个n*size大小的内存块 2)返回内存块的状态不同malloc分配的内存块没有被清零,而calloc分配的内存块是清了零的。但是建议在使用内存时,如果需要初始化,则最好自己按照需要来进行初试化,不要依赖函数的实现说明。13寄存器变量可不可以访问其地址?可否是全局变量?在什么场合使用寄存器变量? 答案:这些问题都与编译器的实现有关,建议不要声明全局变量为寄存器变量,即使是局部变量都最好不要声明其为寄存器变量,现在的编译器在优化时都会较为合理的安排寄存器变量的使用,而人为的安排有时会造成优化的低效。14"n" 'n' 的区别?答案:前者是一个字符串并且以/0结束,而后者只是一个简单的字符。15包含预定义头文件< > 和" "的区别?答案:< >只在指定的目录里寻找被包含文件;" "先在当前目录下查找 ,再在指定目录下查找;通常<>方式用于系统的头文件,而一般用户的头文件用" "的方式。16strunt S_A int a10; ; void f() int i; struct S_A *s_ptr; for (i=0,i<10,i+) s_ptr -> ai = i; 请问这段代码正确否?答案:这段代码不正确,没有对s_ptr指针进行初始化,在编程中要注意此类低级错误的发生。c语言笔试题(八)1. #pragma pack(8)struct s1short a;long b;struct s2char c;s1 d;long long e;#pragma pack()问: 1.sizeof(s2) = ? 242.s2的s1中的a后面空了几个字节接着是b? 2答:sizeof(S2)结果为24.成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.S1中,成员a是2字节默认按2字节对齐,指定对齐参数为8,这两个值中取2,a按2字节对齐;成员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个字节.a bS1的内存布局:11*,1111,c S1.a S1.b dS2的内存布局:1*,11*,1111,*这里有三点很重要:1.每个成员分别按自己的方式对齐,并能最小化长度2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐有程序查一下各个变量的内存地址得知:各个变量在内存中的位置为c*aa*bbbb*dddddddd测试代码为:s2 ss;cout << "ss.c = " << &ss << endl ;cout << "ss.d.a = " <<&ss.d.a << endl;cout << "ss.d.b = " <<&(ss.d.b) << endl;cout << "ss.d = " <<&ss.e << endl;print out 各个变量的内存地址不就可以看出来了吗。所以答案是24,2.c语言笔试题(七)1. 找错Void test1() char string10; char* str1=""strcpy(string, str1);/string数组溢出Void test2() char string10, str110;for(i=0; i<10;i+) str1i ='a'strcpy(string, str1);/str必须是字符串Void test3(char* str1) char string10; if(strlen(str1)<=10)/strlen不统计0字符 strcpy(string, str1);2. 找错#define MAX_SRM 256DSN get_SRM_no() static int SRM_no; int I;for(I=0;I I <MAX_SRM;I+,SRM_no+)SRM_no %= MAX_SRM;if(MY_SRM.state=IDLE) break;if(I>=MAX_SRM)return (NULL_SRM);elsereturn SRM_no;3. 写出程序运行结果int sum(int a) auto int c=0; static int b=3; c+=1; b+=2; return(a+b+C); void main() int I; int a=2; for(I=0;I<5;I+) printf("%d,", sum(a); 答:8 ,10 ,12 ,14, 16,4. int func(int a) int b; switch(a) case 1: b=30; case 2: b=20; case 3: b=16; default: b=0; return b;则func(1)=? /0,因为没有break;5:int a3;a0=0; a1=1; a2=2;int *p, *q;p=a;q=&a2;则aq-p=? 26. 定义 int *a34, 则变量占有的内存空间为:_48_7.编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。c语言笔试题(六)4. static有什么用途?(请至少说明两种)1.限制变量的作用域2.设置变量的存储域7. 引用与指针有什么区别?1) 引用必须被初始化,指针不必。2) 引用初始化以后不能被改变,指针可以改变所指的对象。2) 不存在指向空值的引用,但是存在指向空值的指针。8. 描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在堆栈10. 什么是平衡二叉树?左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于111. 堆栈溢出一般是由什么原因导致的?没有回收垃圾资源12. 什么函数不能声明为虚函数?constructor13. 冒泡排序算法的时间复杂度是什么?O(n2)14. 写出float x 与“零值”比较的if语句。if(x>0.&&x<-0.)16. Internet采用哪种网络协议?该协议的主要层次结构?tcp/ip 应用层/传输层/网络层/数据链路层/物理层17. Internet物理地址和IP地址转换采用什么协议?ARP (Address Resolution Protocol)(地址解析協議)18.IP地址的编码分为哪俩部分?IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。循环链表,用取余操作做3.不能做switch()的参数类型是:switch的参数不能为实型。華為1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。要用全局变量,需要使用":"局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内2、如何引用一个已经定义过的全局变量?答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错4、语句for( ;1 ;)有什么问题?它是什么意思?答:和while(1)相同。5、dowhile和whiledo有什么区别?答:前一个循环一遍再判断,后一个判断以后再循环6、请写出下列代码的输出内容#includemain()int a,b,c,d;a=10;b=a+;c=+a;d=10*a+;printf("b,c,d:%d,%d,%d",b,c,d);return 0;答:10,12,1201、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝2、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。3、设有以下说明和定义:typedef union long i; int k5; char c; DATE;struct data int cat; DATE cow; double dog; too;DATE max;则语句 printf("%d",sizeof(struct date)+sizeof(max);的执行结果是:_52_答:DATE是一个union, 变量公用空间. 里面最大的变量类型是int5, 占用20个字节. 所以它的大小是20data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32.所以结果是 20 + 32 = 52.当然.在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 204、队列和栈有什么区别?队列先进先出,栈后进先出5、写出下列代码的输出内容#include <stdio.h> int inc(int a) return(+a); int multi(int*a,int*b,int*c) return(*c=*a*b); typedef int(FUNC1)(int in); typedef int(FUNC2) (int*,int*,int*); void show(FUNC2 fun,int arg1, int*arg2) FUNC1 p=&inc; int temp =p(arg1); fun(&temp,&arg1, arg2); printf("%dn",*arg2); main() int a; /局部变量a为0; show(multi,10,&a); return 0; 答:1107、请找出下面代码中的所以错误说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”1、#include"string.h"2、main()3、4、 char*src="hello,world"5、 char* dest=NULL;6、 int len=strlen(src);7、 dest=(char*)malloc(len);8、 char* d=dest;9、 char* s=srclen;10、 while(len-!=0)11、 d+=s-;12、 printf("%s",dest);13、 return 0;14、答:方法1:int main()char* src = "hello,world"int len = strlen(src);char* dest = (char*)malloc(len+1);/要为分配一个空间char* d = dest;char* s = &srclen-1;/指向最后一个字符while( len- != 0 )*d+=*s-;*d = 0;/尾部要加printf("%sn",dest);free(dest);/ 使用完,应当释放空间,以免造成内存汇泄露return 0;方法2:#include #include main()char str="hello,world"int len=strlen(str);char t;for(int i=0; i<len/2;i+)t=stri;stri=strlen-i-1; strlen-i-1=t;printf("%s",str);return 0;1.-1,2,7,28,126请问28和126中间那个数是什么?为什么?第一题的答案应该是43-1=63规律是n3-1(当n为偶数0,2,4)n3+1(当n为奇数1,3,5)答案:632.用两个栈实现一个队列的功能?要求给出算法和思路! 设2个栈为A,B, 一开始均为空.入队:将新元素push入栈A;出队:(1)判断栈B是否为空;(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;(3)将栈B的栈顶元素pop出;这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好。3.在c语言库函数中将一个字符转换成整型的函数是atol()吗,这个函数的原型是什么?函数名: atol功 能: 把字符串转换成长整型数用 法: long atol(const char *nptr);程序例:long int my_atol(char *str) char *p=str; long int result=0; int flag=1; while(*p) if(*p='-') flag=0;p+; if(*p>='0'&&*p<='9') result=result*10+*p-'0' p+; if(*p<'0'|*p>'9') break; if(flag=1) return result; else return -result; 2.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C+中应用什么实现?c用宏定义,c+用inline3.直接链接两个信令点的一组链路称作什么?PPP点到点连接6.软件测试都有那些种类?黑盒:针对系统功能的测试 白盒:测试函数功能,各函数接口7.确定模块的功能和模块的接口是在软件设计的那个队段完成的?概要设计阶段9.unsigned char *p1;unsigned long *p2;p1=(unsigned char *)0x;p2=(unsigned long *)0x;请问p1+5= 0x;p2+5= 0x;三.选择题:1.Ethternet链接到Internet用到以下那个协议?A.HDLC;B.ARP;C.UDP;D.TCP;E.ID2.属于网络层协议的是:A.TCP;B.IP;C.ICMP;D.X.253.Windows消息调度机制是:A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;4.unsigned short hash(unsigned short key)return (key>>)%256请问hash(16),hash(256)的值分别是:A.1.16;B.8.32;C.4.16;D.1.32四.找错题:1.请问下面程序有什么错误?int a602501000,i,j,k;for(k=0;k<=1000;k+)for(j=0;j<250;j+)for(i=0;i<60;i+)aijk=0;把循环语句内外换一下3.以下是求一个数的平方的程序,请找出错误:#define SQUARE(a)(a)*(a)int a=5;int b;b=SQUARE(a+);4.typedef unsigned char BYTEint examply_fun(BYTE gt_len; BYTE *gt_code)BYTE *gt_buf;gt_buf=(BYTE *)MALLOC(Max_GT_Length);.if(gt_len>Max_GT_Length)return GT_Length_ERROR;.思科1. 用宏定义写出swap(x,y)#define swap(x, y)x = x + y;y = x - y;x = x - y;2.数组aN,存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:int do_dup(int a,int N)3 一语句实现x是否为2的若干次幂的判断int i = 512;cout << boolalpha << (i & (i - 1) ? false : true) << endl;慧通:什么是预编译何时需要预编译:char * const p;char const * pconst char *p上述三个有什么区别?char * const p; /常量指针,p的值不可以修改char const * p;/指向常量的指针,指向的常量值不可以改const char *p; /和char const *pchar str1 = "abc"char str2 = "abc"const char str3 = "abc"const char str4 = "abc"const char *str5 = "abc"const char *str6 = "abc"char *str7 = "abc"char *str8 = "abc"cout << ( str1 = str2 ) << endl;cout << ( str3 = str4 ) << endl;cout << ( str5 = str6 ) << endl;cout << ( str7 = str8 ) << endl;结果是:0 0 1 1解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。一个32位的机器,该机器的指针是多少位指针是多少位只要看地址总线的位数就行了。8