--1--c语言常见笔试题总结【1使用宏】1.1#ifdefNDEBUG#defineTRACE(S)S#else#defineTRACE(S)printf(%s;\n,#S);S#endif问:以上TRACE()宏的作用是什么?1.2#error的作用?1.3定义一个宏,求出给定数组中的元素的个数#defineNELEMENTS(array)??1.4定义一个宏,求出给定结构中给定成员的偏移量#defineOFFSET(structure,member)??【2数据声明和定义】给定以下类型的变量a的定义式:a)Anintegerb)Apointertoanintegerc)Apointertoapointertoanintegerd)Anarrayof10integerse)Anarrayof10pointerstointegersf)Apointertoanarrayof10integersg)ApointertoaIfunction/Ithattakesanintegerasanargumentandreturnsanintegerh)AnarrayoftenpointerstoIfunction/Isthattakeanintegerargumentandreturnaninteger【3复杂类型(1)】有如下表达式:char(*(*x())[])();请用文字描述x是什么。【4复杂类型(2)】jmp_buf的定义:typedefstruct_jmp_buf{REG_SETreg;intextra[3];}jmp_buf[1];setjmp函数的原型:externintsetjmp(jmp_buf__env);问:调用setjmp时传递__env的内容,还是传递指针?【5头文件】问:为什么标准头文件都有类似以下的结构?#ifndef__INCvxWorksh#define__INCvxWorksh#ifdef__cplusplusexternC{#endif/*...*/#ifdef__cplusplus}#endif#endif/*__INCvxWorksh*/【6static关键字】--2--请说出static关键字的3种用处:(1)用于全局变量;(2)用于局部变量;(3)用于函数。/*file.c*/staticinta;intb;staticintfn(){staticintx;inty;}【7const关键字】7.1const关键字的意义是什么?7.2解释以下的变量定义:constinta1;intconsta2;constint*a3;int*consta4;intconst*consta5;【8volatile关键字】8.1volatile意义?例如volatileint*p;8.2volatile能和const一起使用吗?例如volatileconstint*p;【9sizeof()】有以下定义:char*pmsg=A;charmsg[]=A;charch='A';问:sizeof(pmsg)=?sizeof(msg)=?sizeof(“A”)=?sizeof(ch)=?sizeof(‘A’)=?(在C++中等于多少?)voidf(charparam[100]){//sizeof(param)=?}【10字符串】有以下代码char*pmsg=hello,world!;strcpy(pmsg,hi,there.);试评论该代码。【11混合运算】有以下代码:voidfoo(){unsignedinta=6;intb=-20;(a+b6)?puts(6):puts(=6);}--3--请问调用foo()的输出?【12内存访问】有以下代码:voidfn(){inta[100];int*p;p=(int*)((unsignedint)a+1);printf(“p=0x%x\n”,*p);}试评论以上代码。【13C库函数】请说明以下函数的意义:voidperror(constchar*__s);fdprintf(int,constchar*,...);isspace(),isxdigit(),strerr(),sprintf()coon@23:44:01|阅读全文|评论0|引用0|编辑c语言笔试题(九)2006-09-06Tag:C语言1.#includestdio.hintmain(){inta;int*p;p=&a;*p=0x500;a=(int)(*(&p));a=(int)(&(*p));if(a==(int)p)printf(equal!\n);elseprintf(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)的大小为多少?--4--答案: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语言中写可重入函数,应注意的事项?答案:可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果的正确性的函数。在编写可重入函数时通常要注意如下的一些问题:尽量不要使用全局变量,静态变量,如果使用了应该注意对变量访问的互斥。通常可以根据具体的情况采用:信号量机制,关调度机制,关中断机制等方式来保证函数的可重入性。不要调用不可重入的函数,调用了不可重入的函数会使该函数也变为不可重入的函数。注意对系统中的临界资源,互斥资源的访问方式,防止使函数成为不可重入的函数。一般驱动程序都是不可重入的函数,因此在编写驱动程序时一定要注意重入的问题。6.简述stackframe的含义。答案:stackframe的中文译名为:栈框架,表示函数在栈空间的调用层次,以x86平台的函数调用为例,通常一个函数编译成汇编程序,都有如下的结构:其中的leave指令相当于:movebp,esp;popebp各个函数在栈空间的映象为:test1函数test2函数test3函数因此在函数test3中,就可以根据这种栈框架的形式得到函数调用层次上的每个函数的基址指针,当前--5--栈指针,以及函数调用点等信息。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*p11.在头文件中定义静态变量,可能产生什么问题?答案:在使用了该头文件的每个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;--6--for(i=0,i10,i++)s_ptr-a[i]=i;}请问这段代码正确否?答案:这段代码不正确,没有对s_ptr指针进行初始化,在编程中要注意此类低级错误的发生。coon@23:37:37|阅读全文|评论0|引用0|编辑c语言笔试题(八)2006-09-06Tag: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;//2BYteslongb;//4Bytes};structs2{charc;//1Bytes1d;//8Byteslonglonge;//8Bytes};//1***11**//1111****--7--//11111111////0001020