1、mfc面试题1. 什么是预编译 何时需要预编译:、总是使用不经常改动的大型代码体。 、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。2. char * const p;char const * pconst char *p上述三个有什么区别?char * const p; /常量指针,p的值不可以修改char const * p;/指向常量的指针,指向的常量值不可以改const char *p; /和char const *p3. char str1 = abc;char str2 = abc;const char
2、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是指针,它们指向相同的常量
3、区域。4. 以下代码中的两个sizeof用法有问题吗?void UpperCase( char str ) / 将 str 中的小写字母转换成大写字母 for( size_t i=0; isizeof(str)/sizeof(str0); +i ) if( a=stri & stri=z ) stri -= (a-A );char str = aBcDe;cout str字符长度为: sizeof(str)/sizeof(str0) endl;UpperCase( str );cout str (Y)?(Y):(X)/结尾没有;9. 关键字volatile有什么含意?并举出三个不同的例子?提示
4、编译器对象的值可能在编译器未监测到的情况下改变。10. int (*s10)(int) 表示的是什么啊int (*s10)(int) 函数指针数组,每个指针指向一个int func(int param)的函数。11. 有以下表达式: int a=248; 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 说了是con
5、st 禁止const *f const =&a; 禁止12. 交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;有两种解法, 一种用算术算法, 一种用(异或)a = a + b;b = a - b;a = a - b; ora = ab;/ 只能对int,char.b = ab;a = ab;ora = b = a;13. c和c+中的struct有什么不同?c和c+中struct的主要区别是c中的struct不可以含有成员函数,而c+中的struct可以。c+中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默
6、认为private14. #include #include void getmemory(char *p) p=(char *) malloc(100); 正合适的?问题 strcpy(p,hello world); int main( ) char *str=NULL; getmemory(str); printf(%s/n,str); free(str); return 0; 程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险15. char szstr10; strcpy(szstr,0123456789); 产生什么结果?为什么? 长度不
7、一样,会造成非法的操作,破坏其他内存区的数据16. 列举几种进程的同步机制,并比较其优缺点。 原子操作 信号量机制 自旋锁 管程,会合,分布式系统17. 进程之间通信的途径共享存储系统消息传递系统管道:以文件系统为基础18. 进程死锁的原因资源竞争及进程推进顺序非法19. 死锁的4个必要条件互斥、请求保持、不可剥夺、环路20. 死锁的处理鸵鸟策略、预防策略、避免策略、检测与解除死锁21. 操作系统中进程调度策略有哪几种?FCFS(先来先服务),优先级,时间片轮转,多级反馈22. 纯虚函数如何定义?使用时应注意什么?virtual void f()=0;是接口,子类必须要实现23. 数组和链表的
8、区别数组:数据顺序存储,固定大小连表:数据可以随机存储,大小可动态改变24. ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?应用层表示层会话层运输层网络层物理链路层物理层tcp /udp属于运输层TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。由于 UDP 比较简单, UDP 头包含很少的字节,比 TCP 负载消耗少。tcp: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好udp: 不提供稳定的服务,包头小,开销小 25. (void
9、*)ptr 和 (*(void*)ptr的结果是否相同?其中ptr为同一个指针.(void *)ptr 和 (*(void*)ptr值是相同的26. int main() int x=3; printf(%d,x); return 1; 问函数既然不会被其它函数调用,为什么要返回1?mian中,c标准认为0表示成功,非0表示错误。具体的值是某中具体出错信息27. 要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234;那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?*(void (*)( )0x100000 ) ( );首先
10、要将0x100000强制转换成函数指针,即:(void (*)()0x100000然后再调用它:*(void (*)()0x100000)();用typedef可以看得更直观些:typedef void(*)() voidFuncPtr;*(voidFuncPtr)0x100000)();28. 已知一个数组table,用一个宏定义,求出数据的元素个数#define NTBL#define NTBL (sizeof(table)/sizeof(table0)29. 线程与进程的区别和联系? 线程是否具有相同的堆栈? dll是否有独立的堆栈?进程是死的,只是一些资源的集合,真正的程序执行都是线程
11、来完成的,程序启动的时候操作系统就帮你创建了一个主线程。每个线程有自己的堆栈。DLL中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。因为DLL中的代码是被某些线程所执行,只有线程拥有堆栈,如果DLL中的代码是EXE中的线程所调用,那么这个时候是不是说这个DLL没有自己独立的堆栈?如果DLL中的代码是由DLL自己创建的线程所执行,那么是不是说DLL有独立的堆栈?以上讲的是堆栈,如果对于堆来说,每个DLL有自己的堆,所以如果是从DLL中动态分配的内存,最好是从DLL中删除,如果你从DLL中分配内存,然后在EXE中,或者另外一个DLL中删除,很有可能导致程序崩溃30. unsig
12、ned short A = 10;printf(A = %un, A);char c=128; printf(c=%dn,c);输出多少?并分析过程第一题,A 0xfffffff5,int值 为11,但输出的是uint。所以输出4294967285第二题,c0x10,输出的是int,最高位为1,是负数,所以它的值就是0x00的补码就是128,所以输出128。这两道题都是在考察二进制向int或uint转换时的最高位处理。31. 分析下面的程序:void GetMemory(char *p,int num) *p=(char *)malloc(num); int main() char *str=
13、NULL; GetMemory(&str,100); strcpy(str,hello); free(str); if(str!=NULL) strcpy(str,world); printf(n str is %s,str); getchar(); 问输出结果是什么?希望大家能说说原因,先谢谢了输出str is world。free 只是释放的str指向的内存空间,它本身的值还是存在的.所以free之后,有一个好的习惯就是将str=NULL.此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的,尽管这段程序确实是存在大大的问题(
14、上面各位已经说得很清楚了),但是通常会打印出world来。这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的,只不过。楼上都说过了,最好别这么干。32. char a10,strlen(a)为什么等于15?运行的结果#include stdio.h#include string.hvoid main()cha
15、r aa10;printf(%d,strlen(aa);sizeof()和初不初始化,没有关系;strlen()和初始化有关。char (*str)20;/*str是一个数组指针,即指向数组的指针*/char *str20;/*str是一个指针数组,其元素为指针型数据*/33. 给定结构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:4; 4位 unsigned short i:8; 8位 unsigned long m
16、; / 偏移2字节保证4字节对齐; / 共8字节34. #include #include #include #include #include #include typedef struct AA int b1:5; int b2:2;AA;void main() AA aa; char cc100; strcpy(cc,0123456789abcdefghijklmnopqrstuvwxyz); memcpy(&aa,cc,sizeof(AA); cout aa.b1 endl; cout aa.b2 0 & b0 &(*ca | *cb) | (a0 & ba | *cb); 什么破玩意
17、37. 改错: 非常好的例子 #include int main(void) int *p; int arr100; p = &arr; return 0;解答:搞错了,是指针类型不同,int *p; /二级指针&arr; /得到的是指向第一维为100的数组的指针#include int main(void) int *p, *q;int arr100;q = arr;p = &q;return 0;38. 下面这个程序执行后会有什么错误或者效果: #define MAX 255 int main() unsigned char AMAX,i;/i被定义为unsigned char for (
18、i=0;i=MAX;i+) Ai=i;解答:死循环加数组越界访问(C/C+不进行数组越界检查)MAX=255 数组A的下标范围为:0.MAX-1,这是其一.其二.当i循环到255时,循环内执行: A255=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,sizeo
19、f(struct name2)=12在第二个结构中,为保证num按四个字节对齐,char后必须留出3字节的空间;同时为保证整个结构的自然对齐(这里是4字节对齐),在x后还要补齐2个字节,这样就是12字节。intel40. A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?static的全局变量,表明这个变量仅在本模块中有意义,不会影响其他模块。他们都放在数据区,但是编译器对他们的命名是不同的。如果要使变量在其他模块也有意义的话,需要使用extern关键字。42. 输出和为一个给定整数的所有组合例如
20、n=55=1+4;5=2+3(相加的数不能重复)则输出1,4;2,3。#include int main(void)unsigned long int i,j,k;printf(please input the 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=
21、1;scanf(%d,&a);if(a%2=0) for(i=1;ia/2;i+) printf(%d,a,a-i);elsefor(i=1;i=a/2;i+) printf( %d, %d,i,a-i);兄弟,这样的题目若是做不出来实在是有些不应该, 给你一个递规反向输出字符串的例子,可谓是反序的经典例程.(好龟)void inverse(char *p) if( *p = = 0 ) return; inverse( p+1 ); printf( %c, *p );int main(int argc, char *argv) inverse(abc0); return 0;43. 在对齐为
22、4的情况下struct BBB long num; char *name; short int data; char ha; short ba5;*p;p=0x1000000;p+0x200=_;(Ulong)p+0x200=_;(char*)p+0x200=_;希望各位达人给出答案和原因,谢谢拉解答:假设在32位CPU上,sizeof(long) = 4 bytes 好例子sizeof(char *) = 4 bytessizeof(short int) = sizeof(short) = 2 bytessizeof(char) = 1 bytes由于是4字节对齐,sizeof(struct
23、 BBB) = sizeof(*p) = 4 + 4 + 2 + 1 + 1/*补齐*/ + 2*5 + 2/*补齐*/ = 24 bytes (经Dev-C+验证)p=0x1000000;p+0x200=_; = 0x1000000 + 0x200*24(Ulong)p+0x200=_; = 0x1000000 + 0x200(char*)p+0x200=_; = 0x1000000 + 0x200*4可以参考一下指针运算的细节44. 写一段程序,找出数组中第k大小的数,输出数所在的位置。例如2,4,3,4,7中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在1、3随便输出哪一个均可。函数接口为:int find_orderk(const int* narry,const int n,const int k) 要求算法复杂度不能是O(n2)谢谢!可以先用快速排序进行排序,其中用另
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2