1、mfc面试题1. 什么是预编译 何时需要预编译:、老是利用不常常改动的大型代码体。 、程序由多个模块组成,所有模块都利用一组标准的包括文件和相同的编译选项。在这种情形下,能够将所有包括文件预编译为一个预编译头。2. char * const p;char const * pconst char *p上述三个有什么区别?char * const p; char str1 = abc;char str2 = abc;const char str3 = abc;const char str4 = abc;const char *str5 = abc;const char *str6 = abc;ch
2、ar *str7 = abc;char *str8 = abc;cout ( str1 = str2 ) endl;cout ( str3 = str4 ) endl;cout ( str5 = str6 ) endl;cout ( str7 = str8 ) (Y)?(Y):(X) 关键字volatile有什么含义?并举出三个不同的例子?提示编译器对象的值可能在编译器未监测到的情形下改变。10. int (*s10)(int) 表示的是什么啊int (*s10)(int) 函数指针数组,每一个指针指向一个int func(int param)的函数。11. 有以下表达式: int a=248
3、; b=4;int const c=21;const int *d=&a;int *const e=&b;int const *f const =&a;请问以下表达式哪些会被编译器禁止?什么缘故?*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;*c 这是个什么东东,禁止*d 说了是const, 禁止e = &a 说了是const 禁止const *f const =&a; 禁止12. 互换两个变量的值,不利用第三个变量。即a=3,b=5,互换以后a=5,b=3;有两种解法, 一种用算术算法, 一种用(异或)a = a + b;b = a - b;a = a - b; o
4、ra = ab;b = ab;a = ab;ora = b = a;13. c和c+中的struct有什么不同?c和c+中struct的要紧区别是c中的struct不能够含有成员函数,而c+中的struct能够。c+中struct和class的要紧区别在于默许的存取权限不同,struct默以为public,而class默以为private14. #include #include void getmemory(char *p) p=(char *) malloc(100); 正适合的?问题 strcpy(p,hello world); int main( ) char *str=NULL; g
5、etmemory(str); printf(%s/n,str); free(str); return 0; 程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险15. char szstr10; strcpy(szstr,09); 产生什么结果?什么缘故? 长度不一样,会造成非法的操作,破坏其他内存区的数据16. 列举几种进程的同步机制,并比较其优缺点。 原子操作 信号量机制 自旋锁 管程,会合,散布式系统17. 进程之间通信的途径共享存储系统消息传递系统管道:以文件系统为基础18. 进程死锁的缘故资源竞争及进程推动顺序非法19. 死锁的4个必要条件
6、互斥、请求维持、不可剥夺、环路20. 死锁的处置鸵鸟策略、预防策略、幸免策略、检测与解除死锁21. 操作系统中进程调度策略有哪几种?FCFS(先来先效劳),优先级,时刻片轮转,多级反馈22. 纯虚函数如何概念?利历时应注意什么?virtual void f()=0;是接口,子类必需要实现23. 数组和链表的区别数组:数据顺序存储,固定大小连表:数据能够随机存储,大小可动态改变24. ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?应用层表示层会话层运输层网络层物理链路层物理层tcp /udp属于运输层TCP 效劳提供了数据流传输、靠得住性、有效流操纵、全双工操作和
7、多路复用技术等。与 TCP 不同, UDP 并非提供对 IP 协议的靠得住机制、流操纵和错误恢复功能等。由于 UDP 比较简单, UDP 头包括很少的字节,比 TCP 负载消耗少。tcp: 提供稳固的传输效劳,有流量操纵,缺点是包头大,冗余性不行udp: 不提供稳固的效劳,包头小,开销小 25. (void *)ptr 和 (*(void*)ptr的结果是不是相同?其中ptr为同一个指针.(void *)ptr 和 (*(void*)ptr值是相同的26. int main() int x=3; printf(%d,x); return 1; 问函数既然可不能被其它函数挪用,什么缘故要返回1?
8、mian中,c标准以为0表示成功,非0表示错误。具体的值是某中具体犯错信息27. 要对绝对地址0x100000赋值,咱们能够用(unsigned int*)0x100000 = 1234;那么若是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?*(void (*)( )0x100000 ) ( );第一要将0x100000强制转换成函数指针,即:(void (*)()0x100000然后再挪用它:*(void (*)()0x100000)();用typedef能够看得更直观些:typedef void(*)() voidFuncPtr;*(voidFuncPtr)0x100000)
9、();28. 已知一个数组table,用一个宏概念,求出数据的元素个数#define NTBL#define NTBL (sizeof(table)/sizeof(table0)29. 线程与进程的区别和联系? 线程是不是具有相同的堆栈? dll是不是有独立的堆栈?进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。每一个线程有自己的堆栈。DLL中有无独立的堆栈,那个问题不行回答,或说那个问题本身是不是有问题。因为DLL中的代码是被某些线程所执行,只有线程拥有堆栈,若是DLL中的代码是EXE中的线程所挪用,那么那个时候是不是说那个DLL
10、没有自己独立的堆栈?若是DLL中的代码是由DLL自己创建的线程所执行,那么是不是说DLL有独立的堆栈?以上讲的是堆栈,若是关于堆来讲,每一个DLL有自己的堆,因此若是是从DLL中动态分派的内存,最好是从DLL中删除,若是你从DLL中分派内存,然后在EXE中,或另外一个DLL中删除,很有可能致使程序崩溃30. unsigned short A = 10;printf(A = %un, A);char c=128; printf(c=%dn,c);输出多少?并分析进程第一题,A 0xfffffff5,int值 为11,但输出的是uint。因此输出85第二题,c0x10,输出的是int,最高位为1,
11、是负数,因此它的值确实是0x00的补码确实是128,因此输出128。这两道题都是在考察二进制向int或uint转换时的最高位处置。31. 分析下面的程序:void GetMemory(char *p,int num) *p=(char *)malloc(num); int main() char *str=NULL; GetMemory(&str,100); strcpy(str,hello); free(str); if(str!=NULL) strcpy(str,world); printf(n str is %s,str); getchar(); 问输出结果是什么?希望大伙儿能说说缘故,
12、先谢谢了输出str is world。free 只是释放的str指向的内存空间,它本身的值仍是存在的.因此free以后,有一个好的适应确实是将str=NULL.现在str指向空间的内存已被回收,若是输出语句之前还存在分派空间的操作的话,这段存储空间是可能被从头分派给其他变量的,尽管这段程序确实是存在大大的问题(上面列位已经说得很清楚了),可是通常会打印出world来。这是因为,进程中的内存治理一样不是由操作系统完成的,而是由库函数自己完成的。当你malloc一块内存的时候,治理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些治理信息(一样是在你申请的内存前面一点),
13、并将可用内存的地址返回。可是释放内存的时候,治理库通常都可不能将内存还给操作系统,因此你是能够继续访问这块地址的,只只是。楼上都说过了,最好别这么干。32. char a10,strlen(a)什么缘故等于15?运行的结果#include #include void main()char aa10;printf(%d,strlen(aa);sizeof()和初不初始化,没有关系;strlen()和初始化有关。char (*str)20;/*str是一个数组指针,即指向数组的指针*/char *str20;/*str是一个指针数组,其元素为指针型数据*/33. 给定结构struct A char
14、 t:4; char k:4; unsigned short i:8; unsigned long m;问sizeof(A) = ?给定结构struct A char t:4; 4位 char k:4; 4位 unsigned short i:8; 8位 unsigned long m; #include #include #include #include #include #include typedef struct AA int b1:5; int b2:2;AA;void main() AA aa; char cc100; strcpy(cc,09abcdefghijklmnopqr
15、stuvwxyz); memcpy(&aa,cc,sizeof(AA); cout endl; cout 0 & b0 &(*ca | *cb) | (a0 & ba | *cb); 什么破玩意37. 改错: 超级好的例子 #include int main(void) int *p; int arr100; p = &arr; return 0;解答:弄错了,是指针类型不同,int *p; 下面那个程序执行后会有什么错误或成效: #define MAX 255 int main() unsigned char AMAX,i;MAX-1,这是其一.其二.当i循环到255时,循环内执行: A25
16、5=255;这句本身没有问题.可是返回for (i=0;i=MAX;i+)语句时,由于unsigned char的取值范围在(0.255),i+以后i又为0了.无穷循环下去.39. struct name1 char str; short x; int num;struct name2 char str; int num; short x;sizeof(struct name1)=8,sizeof(struct name2)=12在第二个结构中,为保证num按四个字节对齐,char后必需留出3字节的空间;同时为保证整个结构的自然对齐(那个地址是4字节对齐),在x后还要补齐2个字节,如此确实是1
17、2字节。intel40. 和两个c文件中利用了两个相同名字的static变量,编译的时候会可不能有问题?这两个static变量会保留到哪里(栈仍是堆或其他的)?static的全局变量,说明那个变量仅在本模块中成心义,可不能阻碍其他模块。他们都放在数据区,可是编译器对他们的命名是不同的。若是要使变量在其他模块也成心义的话,需要利用extern关键字。42. 输出和为一个给定整数的所有组合例如n=55=1+4;5=2+3(相加的数不能重复)那么输出1,4;2,3。#include int main(void)unsigned long int i,j,k;printf(please input t
18、he numbern);scanf(%d,&i); if( i % 2 = 0) j = i / 2;elsej = i / 2 + 1;printf(The result is n); for(k = 0; k j; k+) printf(%d = %d + %dn,i,k,i - k);return 0;#include void main()unsigned long int a,i=1;scanf(%d,&a);if(a%2=0) for(i=1;ia/2;i+) printf(%d,a,a-i);elsefor(i=1;inext!=NULL&qa-next!=NULL)if(pa-
19、dataqa-data)ra-next=qa;qa=qa-next;elsera-next=pa;pa=pa-next;if(pa-next!=NULL)ra-next=pa;if(qa-next!=NULL)ra-next=qa;return R;47. 用递归算法判定数组aN是不是为一个递增数组。递归的方式,记录当前最大的,而且判定当前的是不是比那个还大,大那么继续,不然返回false终止:bool fun( int a, int n )if( n= =1 )return true;if( n= =2 )return an-1 = an-2;return fun( a,n-1) & ( an-1 = an-2 );51. 单连表的成立,把a-z26个字母插入到连表中,而且倒叙,还要打印!方式1:typedef struct val int date_1; struct val *next;*p;void main(void) char c; for(c=122;c=97;c-) =c; p=p-next; =NULL; 方式2:node *p = NULL;node *q = NULL;node *head = (node*)malloc(sizeof(node);head-data = ;head
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1