c语言常见笔试题总结【1使用宏】1.1#error的作用?#error用于向编译器报错,并输出它后面带的错误信息。例如:#ifndefSOMETHING#errorSOMETHINGnotdefined!#endif如果在这段代码之前未定义过SOMETHING,则在编译时出错,并给出SOMETHINGnotdefined!的错误信息。1.2定义一个宏,求出给定数组中的元素的个数#defineNELEMENTS(array)(sizeof(array)/sizeof((array)[0]))【2数据声明和定义】给定以下类型的变量a的定义式:a)Anintegerinta;b)Apointertoanintegerint*a;c)Apointertoapointertoanintegerint**a;d)Anarrayof10integersinta[10];e)Anarrayof10pointerstointegersint*a[10];f)Apointertoanarrayof10integersint(*a)[10];g)ApointertoaIfunction/Ithattakesanintegerasanargumentandreturnsanintegerint(*a)(int);h)AnarrayoftenpointerstoIfunction/Isthattakeanintegerargumentandreturnanintegerint(*a[10])(int);【3复杂类型(1)】有如下表达式:char(*(*x())[])();请用文字描述x是什么。首先,确定标识符:xx是一个函数,没有参数:x()返回值是一个指针:*x()这个指针指向一个数组:(*x())[]数组中的每个元素是指针:*(*x())[]指向一个不带参数的函数:(*(*x())[])()函数的返回值是char:char(*(*x())[])()这里,要知道*、()和[]的优先级【5头文件】问:为什么标准头文件都有类似以下的结构?#ifndef__INCvxWorksh#define__INCvxWorksh#ifdef__cplusplusexternC{#endif/*...*/#ifdef__cplusplus}#endif#endif在编译源文件时,C编译器和C++编译器都会对符号(函数或变量)名作某些修正,但两者采用的修正方法不同,所以两者生成的目标文件不能互相链接。在C++中使用externC可以让C++符号获得C链接特性。由于C++编译器会自动定义__cplusplus宏,所以在C语言头文件中采用这种结构可以保证无论使用何种编译器,生成的目标文件都具有C链接特性,能够与标准C编译器所生成的目标文件相链接【6static关键字】请说出static关键字的3种用处:(1)用于全局变量;外部静态变量,只能在本源文件中被引用,不能被其它源文件所引用。(2)用于局部变量;局部静态变量,在函数返回后存储单元不释放;下一次调用该函数时,该变量为上次函数返回时的值。(3)用于函数。内部函数,只能被本源文件中的函数所调用,不能被其它源文件调用。/*file.c*/staticinta;intb;staticintfn(){staticintx;inty;}【7const关键字】7.1const关键字的意义是什么?7.2解释以下的变量定义:constinta1;a1是整型常量。intconsta2;a2是整型常量。等同于constinta2。constint*a3;a3是指针(a3是可变的),指向一个整型常量。等同于intconst*a3。int*consta4;a4是常量指针(a4不可变),指向一个整型变量。intconst*consta5;a5是常量指针(a5不可变),指向一个整型常量。等同于constint*consta5。【8volatile关键字】8.1volatile意义?volatileint*p;8.2volatile能和const一起使用吗?const关键字的意思是限制编程者自己不能修改变量的值;两者并不矛盾。例如一个内存映射的、只读的硬件寄存器,假设它的地址是p,则可以这样声明:volatileconstUINT32*p;【9sizeof()】有以下定义:char*pmsg=A;charmsg[]=A;charch='A';问:sizeof(pmsg)=?4sizeof(msg)=?2sizeof(“A”)=?2sizeof(ch)=?1sizeof(‘A’)=?(在C++中等于多少?)(在C语言中,字符常量的数据类型实际上是int;在C++中,它的数据类型是char,从而原式等于1)voidf(charparam[100]){//sizeof(param)=?4}【10字符串】有以下代码char*pmsg=hello,world!;strcpy(pmsg,hi,there.);试评论该代码。【11混合运算】有以下代码:voidfoo(){unsignedinta=6;intb=-20;(a+b6)?puts(6):puts(=6);}请问调用foo()的输出?c语言笔试题(九)1.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语言中写可重入函数,应注意的事项?答案:可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果的正确性的函数。在编写可重入函数时通常要注意如下的一些问题:尽量不要使用全局变量,静态变量,如果使用了应该注意对变量访问的互斥。通常可以根据具体的情况采用:信号量机制,关调度机制,关中断机制等方式来保证函数的可重入性。不要调用不可重入的函数,调用了不可重入的函数会使该函数也变为不可重入的函数。注意对系统中的临界资源,互斥资源的访问方式,防止使函数成为不可重入的函数。一般驱动程序都是不可重入的函数,因此在编写驱动程序时一定要注意重入的问题。6.简述stackframe的含义。答案:stackframe的中文译名为:栈框架,表示函数在栈空间的调用层次,7.printf(“%d%d\n”,++n,power(2,n));其中power(2,n)为实现一定功能的函数如2^n。请问这种表示方法有什么潜在的问题?答案:编译器的不同,对++n和power(2,n)处理的先后顺序不一样,形成二义性,造成程序的移植性差,因此最好把++n写在printf函数外面,以消除二义性。8.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;structS_A*s_ptr;for(i=0,i10,i++)s_ptr-a[i]=i;}请问这段代码正确否?答案:这段代码不正确,没有对s_ptr指针进行初始化,在编程中要注意此类低级错误的发生。c语言笔试题(八)1.#pragmapack(8)structs1{shorta;longb;};structs2{charc;s1d;longlonge;};#pragmapack()问: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一