《c语言经典笔试题(非常全)》由会员分享,可在线阅读,更多相关《c语言经典笔试题(非常全)(54页珍藏版)》请在金锄头文库上搜索。
1、1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。#define MIN(A,B) (A) 6) puts( 6) : puts(6 13. 评价下面的代码片断:unsigned int zero = 0; unsigned int compzero = 0xFFFF; /*1s complement of zero */14. 尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态
2、分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?主要有三种类型:内存泄露、内存碎片和内存崩溃 内存崩溃是内存使用最严重的结果,主要原因有数组访问越界、写已经释放的内存、指针计算错误、访问堆栈地址越界等等。碎片收集的问题,变量的持行时间等等下面的代码片段的输出是什么,为什么?char *ptr; if (ptr = (char *)malloc(0) = NULL) puts(Got a null pointer); else puts(Got a valid pointer); 该代码的输出是“Got a valid pointer”。15. Typedef 在C语言中频
3、繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子: #define dPS struct s * typedef struct s * tPS; 答案是:typedef更好。思考下面的例子: dPS p1,p2; tPS p3,p4;第一个扩展为 struct s * p1, p2;上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。16. C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么? int a = 5, b = 7, c; c = a+b;上面的
4、代码被处理成: c = a+ + b; 因此, 这段代码持行后a = 6, b = 7, c = 12。 17.找错题试题1:void test1()char string10;char* str1 = 0123456789;strcpy( string, str1 ); 试题2:void test2()char string10, str110;int i;for(i=0; i= - epsinon) & (x =”或“65536 ) coutvoid main()int i=60;int j=50;i=i+j;j=i-j;i=i-j;printf(i=%dn,i);printf(j=%dn
5、,j);方法二:i=j;j=i;i=j;方法三:/ 用加减实现,而且不会溢出a = a+b-(b=a).进程间通信的方式有?进程间通信的方式有 共享内存, 管道 ,Socket ,消息队列 ,等39 struct A char t:4; char k:4; unsigned short i:8; unsigned long m; sizeof(A)=?(不考虑边界对齐)740给定结构struct A char t:4;char k:4;unsigned short i:8;unsigned long m;问sizeof(A) = ?给定结构struct A char t:4; 4位char k
6、:4; 4位unsigned short i:8; 8位 unsigned long m; / 偏移2字节保证4字节对齐; / 共8字节41 下面的函数实现在一个固定的数上加上一个数,有什么错误,改正 int add_n(int n) static int i=100; i+=n; return i; 答:因为 static 使得 i 的值会保留上次的值。去掉 static 就可了42 union a int a_int1;double a_double;int a_int2;typedef structa a1;char y; b;class cdouble c_double;b b1;a
7、a2;输出 coutj+) & (i+ = j) i+=j;答:i = 544 unsigned short array=1,2,3,4,5,6,7;int i = 3;*(array + i) = ?答:445 试编写函数判断计算机的字节存储顺序是开序(little endian)还是降序(bigendian)答:bool IsBigendian()unsigned short usData = 0x1122;unsigned char *pucData = (unsigned char*)&usData;return (*pucData = 0x22);46 简述 Critical Sec
8、tion 和 Mutex 的不同点答:对几种同步对象的总结1.Critical SectionA.速度快B.不能用于不同进程C.不能进行资源统计(每次只可以有一个线程对共享资源进行存取)2.MutexA.速度慢B.可用于不同进程C.不能进行资源统计3.SemaphoreA.速度慢B.可用于不同进程C.可进行资源统计(可以让一个或超过一个线程对共享资源进行存取)4.EventA.速度慢B.可用于不同进程C.可进行资源统计47 请指出下列程序中的错误并且修改void GetMemory(char *p)p=(char *)malloc(100);void Test(void)char *str=N
9、ULL;GetMemory=(str);strcpy(str,hello world);printf(str);A:错误-参数的值改变后,不会传回GetMemory 并不能传递动态内存,Test 函数中的 str 一直都是 NULL。strcpy(str, hello world);将使程序崩溃。修改如下:char *GetMemory()char *p=(char *)malloc(100);return p;void Test(void)char *str=NULL;str=GetMemory()strcpy(str,hello world); printf(str);方法二:void G
10、etMemory2(char *p)变为二级指针.void GetMemory2(char *p, int num)*p = (char *)malloc(sizeof(char) * num);48 用 C 写一个输入的整数,倒着输出整数的函数,要求用递归方法 ;答:void fun( int a )printf( %d, a%10 );a /= 10;if( a int main(void) int *p;int arr100;p = &arr;return 0;解答:搞错了,是指针类型不同,int *p; /二级指针&arr; /得到的是指向第一维为100的数组的指针i nclude i
11、nt main(void) int *p, *q;int arr100;q = arr;p = &q;return 0;99下面这个程序执行后会有什么错误或者效果:#define MAX 255int main()unsigned char AMAX,i;/i被定义为unsigned charfor (i=0;ii nclude int main(void)int MAX = 10;int *a = (int *)malloc(MAX * sizeof(int);int *b;FILE *fp1;FILE *fp2;fp1 = fopen(a.txt,r);if(fp1 = NULL)prin
12、tf(error1);exit(-1);fp2 = fopen(b.txt,w);if(fp2 = NULL)printf(error2);exit(-1);int i = 0;int j = 0;while(fscanf(fp1,%d,&ai) != EOF)i+;j+;if(i = MAX)MAX = 2 * MAX;b = (int*)realloc(a,MAX * sizeof(int);if(b = NULL)printf(error3);exit(-1);a = b;for(;-j = 0;)fprintf(fp2,%dn,aj);fclose(fp1);fclose(fp2);r
13、eturn 0;102 一个递规反向输出字符串的例子,经典例程.void inverse(char *p)if( *p = = 0 ) return;inverse( p+1 );printf( %c, *p );int main(int argc, char *argv)inverse(abc0);return 0;103、用递归算法判断数组aN是否为一个递增数组。递归的方法,记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回false结束:bool fun( int a, int n )if( n= =1 )return true;if( n= =2 )return an-1
14、 = an-2;return fun( a,n-1) & ( an-1 = an-2 );104 什么是可重入性?可重入(reentrant )函数可以由多于一个任务并发使用,而不必担心数据错误。相反,不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断) 。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。105 可重入函数:不为连续的调用持有静态数据。不返回指向静态数据的指针;所有数据都由函数的调用者提供。使用本地数据,或者通过制作全
15、局数据的本地拷贝来保护全局数据。如果必须访问全局变量,记住利用互斥信号量来保护全局变量。绝不调用任何不可重入函数。 ;106.用最简单的方法实现函数int strcmp(char *p1,char *p2)int ret;/while( *p1 & *p2 & !(ret=*p1-*p2) )while(!(ret=*p1-*p2) & *p1 & *p2)p1+;p2+;return ret;int strcmp(const char * cs,const char * ct)register signed char _res;while (1) if (_res = *cs - *ct+) != 0 | !*cs+)break;return _res;107 什么是预编译,何时需要预编译: 答案: 、总是使用不经常改动的大型代码体。 、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 108 char * const p char const * p const char *p 上述三个有什么区别? 答案: char * const p