C/C++常见面试题

来源:互联网 发布:软件代理商协议 编辑:程序博客网 时间:2024/05/29 04:37

一、常见字符串

1. 写出在母串中查找子串出现次数的代码。
[cpp] view plaincopy
  1. int count(char* str,char* substr)  
  2. {  
  3. char* str1;  
  4. char* str2;  
  5. int num = 0;  
  6. while(*str!='\0')  
  7. {  
  8. str1 = str;  
  9. str2 = s;  
  10. while(*str2 == *str1&&(*str2!='\0')&&(*str1!='0'))  
  11. {  
  12. str2++;  
  13. str1++;  
  14. }  
  15. if(*str2 == '\0')  
  16. num++;  
  17. str++;  
  18. }  
  19. return num;  
  20. }  


2. 查找第一个匹配子串位置,如果返回的是str1长度len1表示没有找到。
[cpp] view plaincopy
  1. size_t find(char* str1,char* str2)  
  2. {  
  3. size_t i=0;  
  4. size_t len1 = strlen(str1)  
  5. size_t len2 = strlen(str2);  
  6. if(len1-len2<0) return len1;  
  7. for(;i<len1-len2;i++)  
  8. {  
  9. size_t m = i;  
  10. size_t j=0  
  11. for(;size_t j=0;j<len2;j++)  
  12. {  
  13. if(str1[m]!=str2[j])  
  14. break;  
  15. m++;  
  16. }  
  17. if(j==len)  
  18. break;  
  19. }  
  20. return i<len1-len2?i:len1;  
  21. }  


3. 实现strcpy函数。
[cpp] view plaincopy
  1. char *strcpy(char *dst, const char *src)  
  2. {  
  3. assert(dst!=NULL&&src!=NULL);  
  4. char* target = dst;  
  5. while(*dst++=*src++);  
  6. return target ;  
  7. }  


4. 实现字符串翻转。
[cpp] view plaincopy
  1. void reserve(char* str)  
  2. {  
  3. assert(str != NULL);  
  4. char * p1 = str;  
  5. char * p2 = str-1;  
  6. while(*++p2); //一般要求不能使用strlen  
  7. p2 -= 1;  
  8. while(p1<p2)  
  9. {  
  10. char c = *p1;  
  11. *p1++ = *p2;  
  12. *p2-- = c;  
  13. }  
  14. }  


5. 实现strcmp函数。
[cpp] view plaincopy
  1. int strcmp11(char* src,char* dst)  
  2. {  
  3. assert(src!=0&&r!=0);  
  4. while(*src == *dst &&*src != '\0')  
  5. {  
  6. src++,  
  7. dst++;  
  8. }  
  9. if(*src > *dst)  
  10. return 1;  
  11. else if(*src == *dst)  
  12. return 0;  
  13. return -1;  
  14. }  


6. 用指针的方法,将字符串“ABCD1234efgh”前后对调显示。
//不要用strlen求字符串长度,这样就没分了
[cpp] view plaincopy
  1. char str123[] = "ABCD1234efgh";  
  2. char * p1 = str123;  
  3. char * p2 = str123-1;  
  4. while(*++p2);  
  5. p2 -= 1;  
  6. while(p1<p2)  
  7. {  
  8. char c = *p1;  
  9. *p1++ = *p2;  
  10. *p2-- = c;  
  11. }  


7. 给定字符串A和B,输出A和B中的最大公共子串。比如A="aocdfe" B="pmcdfa" 则输出"cdf"。
[cpp] view plaincopy
  1. #i nclude<stdio.h>  
  2. #i nclude<stdlib.h>  
  3. #i nclude<string.h>  
  4. char *commanstring(char shortstring[], char longstring[])  
  5. {  
  6. int i, j;  
  7. char *substring=malloc(256);  
  8. if(strstr(longstring, shortstring)!=NULL) //如果……,那么返回  
  9. return shortstring; ;  
  10. for(i=strlen(shortstring)-1;i>0; i--) //否则,开始循环计算  
  11. {  
  12. for(j=0; j<=strlen(shortstring)-i; j++)  
  13. {  
  14. memcpy(substring, &shortstring[j], i);  
  15. substring[i]='\0';  
  16. if(strstr(longstring, substring)!=NULL)  
  17. return substring;  
  18. }  
  19. }  
  20. return NULL;  
  21. }  
  22. int main()  
  23. {  
  24. char *str1=malloc(256);  
  25. char *str2=malloc(256);  
  26. char *comman=NULL;  
  27. gets(str1);  
  28. gets(str2);  
  29. if(strlen(str1)>strlen(str2)) //将短的字符串放前面  
  30. comman=commanstring(str2, str1);  
  31. else  
  32. comman=commanstring(str1, str2);  
  33. printf("the longest comman string is: %s\n", comman);  
  34. }  


8. 判断一个字符串是不是回文。
[cpp] view plaincopy
  1. int IsReverseStr(char *str)  
  2. {  
  3. int i,j;  
  4. int found=1;  
  5. if(str==NULL)  
  6. return -1;  
  7. char* p = str-1;  
  8. while(*++p!= '\0');  
  9. --p;  
  10. while(*str==*p&&str<p) str++,p--;  
  11. if(str < p)  
  12. found = 0;  
  13. return found;  
  14. }  


9. 写函数完成内存的拷贝。
[cpp] view plaincopy
  1. void* memcpy( void *dst, const void *src, unsigned int len )  
  2. {  
  3. register char *d;  
  4. register char *s;  
  5. if (len == 0)  
  6. return dst;  
  7. if ( dst > src ) //考虑覆盖情况  
  8. {  
  9. d = (char *)dst + len - 1;  
  10. s = (char *)src + len - 1;  
  11. while ( len >= 4 ) //循环展开,提高执行效率  
  12. {  
  13. *d-- = *s--;  
  14. *d-- = *s--;  
  15. *d-- = *s--;  
  16. *d-- = *s--;  
  17. len -= 4;  
  18. }  
  19. while ( len-- )  
  20. {  
  21. *d-- = *s--;  
  22. }  
  23. }  
  24. else if ( dst < src )  
  25. {  
  26. d = (char *)dst;  
  27. s = (char *)src;  
  28. while ( len >= 4 )  
  29. {  
  30. *d++ = *s++;  
  31. *d++ = *s++;  
  32. *d++ = *s++;  
  33. *d++ = *s++;  
  34. len -= 4;  
  35. }  
  36. while ( len-- )  
  37. {  
  38. *d++ = *s++;  
  39. }  
  40. }  
  41. return dst;  
  42. }  


10. 写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)。
功能:
在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789
[cpp] view plaincopy
  1. int continumax(char *outputstr, char *inputstr)  
  2. {  
  3. char *in = inputstr, *out = outputstr, *temp, *final;  
  4. int count = 0, maxlen = 0;  
  5. while( *in != '\0' )  
  6. {  
  7. if( *in > 47 && *in < 58 )  
  8. {  
  9. for(temp = in; *in > 47 && *in < 58 ; in++ )  
  10. count++;  
  11. }  
  12. else  
  13. in++;  
  14. if( maxlen < count )  
  15. {  
  16. maxlen = count;  
  17. count = 0;  
  18. final = temp;  
  19. }  
  20. }  
  21. for(int i = 0; i < maxlen; i++)  
  22. {  
  23. *out = *final;  
  24. out++;  
  25. final++;  
  26. }  
  27. *out = '\0';  
  28. return maxlen;  
  29. }  


二、常识题
1. 请说出static和const关键字的作用,至少说出两种。
static关键字至少有下列5个作用:
⑴ 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
⑵ 在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数
C++从入门到精通
8
访问;
⑶ 在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
⑷ 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
⑸ 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
const关键字至少有下列5个作用:
⑴ 欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
⑵ 对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
⑶ 在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
⑷ 对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
⑸ 对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例如:
const classA operator*(const classA& a1,const classA& a2);
operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:
classA a, b, c;
(a * b) = c; // 对a*b的结果赋值操作(a * b) = c显然不符合编程者的初衷,也没有任//何意义
2. 如何判断是C还是C++编译器?
#ifdefine _CPLUSPLUC
cout<<”C++”;
#else
cout <<”C””;
3. 如何避免重复包含一个头文件?
#ifndef _HEADER_
#define _HEADER_
……
#endif

4. 在什么时候需要使用“常引用”?
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名。
5. 引用与指针有什么区别?
⑴ 引用必须被初始化,指针不必。
⑵ 引用初始化以后不能被改变,指针可以改变所指的对象。
⑶ 不存在指向空值的引用,但是存在指向空值的指针。
⑷ 重载操作符使用引用可以完成串试操作。
6. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
全局变量储存在全局静态存储区,局部变量在堆栈。
7. 什么是平衡二叉树?
左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。
8. 什么函数不能声明为虚函数?
构造函数。
9. 冒泡排序算法和快速排序算法的时间复杂度分别是什么?
冒泡排序:O(n^2)。
快速排序 o(nlgn)。
10. 进程间通信的方式有哪些?
进程间通信的方式有:共享内存,管道,Socket,消息队列,DDE等。
11. 纯虚函数如何定义?使用时应注意什么?
virtual void f()=0;
纯虚函数是接口,子类必须要实现。
12. c和c++中的struct有什么不同?
c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private。
13. const 符号常量:
(1) const char *p
(2) char const *p
(3) char * const p
说明上面三种描述的区别?
如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
14. 数组和链表的区别?
数组:数据顺序存储,固定大小。
连表:数据可以随机存储,大小可动态改变。
15. 线程与进程的区别和联系? 线程是否具有相同的堆栈? dll是否有独立的堆栈?
进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。每个线程有自己的堆栈。
DLL中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。因为DLL中的代码是被某些线程所执行,只有线程拥有堆栈,如果DLL中的代码是EXE中的线程所调用,那么这个时候是不是说这个DLL没有自己独立的堆栈?
如果DLL中的代码是由DLL自己创建的线程所执行,那么是不是说DLL有独立的堆栈?
以上讲的是堆栈,如果对于堆来说,每个DLL有自己的堆,所以如果是从DLL中动态分配的内存,最好是从DLL中删除,如果你从DLL中分配内存,然后在EXE中,或者另外一个DLL中删除,很有可能导致程序崩溃。
16. 是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?
virtual修饰符会被隐形继承的。private 也被集成,只事派生类没有访问权限而已。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存在一个
C++常见面试题 王牌7
11
实体(inline除外)。子类覆盖它的函数不加virtual ,也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。
17. 请简单描述Windows内存管理的方法。
内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理
块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的内存空间,但时易于管理。
页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。
段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。
段页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。
18. 下面两种if语句判断方式。请问哪种写法更好?为什么?
int n;
if (n == 10) // 第一种判断方式
if (10 == n) // 第二种判断方式
第二种好,因为如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了‘=‘。
19. C和C++有什么不同?
从机制上:c是面向过程的(但c也可以编写面向对象的程序);c++是面向对象的,提供了类。但是, c++编写面向对象的程序比c容易从适用的方向:c适合要求代码体积小的,效率高的场合,如嵌入式;c++适合更上层的,复杂的; llinux核心大部分是c写的,因为它是系统软件,效率要求极高。从名称上也可以看出,c++比c多了+,说明c++是c的超集;那为什么不叫c+而叫c++呢,是因为c++比 c来说扩充的东西太多了,所以就在c后面放上两个+;于是就成了c++ C语言是结构化编程语言,C++是面向对象编程语言。C++侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。
C++从入门到精通
12
20. 请从下述答案中选择一个正确的答案。
class A
{
virtual void func1();
void func2();
}
Class B: class A
{
void func1(){cout < < "fun1 in class B" < < endl;}
virtual void func2(){cout < < "fun2 in class B" < < endl;}
}
A, A中的func1和B中的func2都是虚函数.
B, A中的func1和B中的func2都不是虚函数.
C, A中的func2是虚函数.,B中的func1不是虚函数.
D, A中的func2不是虚函数,B中的func1是虚函数.
答:A
三、编程题
1. 写出下述程序的运行结果。
[cpp] view plaincopy
  1. int sum(int a)  
  2. {  
  3. auto int c=0;  
  4. static int b=3;  
  5. c+=1;  
  6. b+=2;  
  7. return(a+b+c);  
  8. }  
  9. int main()  
  10. {  
  11. int I;  
  12. int a=2;  
  13. for(I=0;I<5;I++)  
  14. {  
  15. printf("%d,", sum(a));  
  16. }  
  17. }  


// static会保存上次结果,记住这一点,剩下的自己写
输出:8,10,12,14,16,
2. 求1000!的未尾有几个0?
(用素数相乘的方法来做,如72=2*2*2*3*3);求出1->1000里,能被5整除的数的个数n1,能被25整除的数的个数n2,能被125整除的数的个数n3,能被625整除的数的个数n4.1000!末尾的零的个数=n1+n2+n3+n4;
[cpp] view plaincopy
  1. int sum(int a)  
  2. {  
  3. auto int c=0;  
  4. static int b=3;  
  5. c+=1;  
  6. b+=2;  
  7. return(a+b+c);  
  8. }  
  9. int main()  
  10. {  
  11. int I;  
  12. int a=2;  
  13. for(I=0;I<5;I++)  
  14. {  
  15. printf("%d,", sum(a));  
  16. }  
  17. }  


3. 编程实现:把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列库函数。
[cpp] view plaincopy
  1. char* test3(long num)  
  2. {  
  3. char* buffer = (char*)malloc(11);  
  4. buffer[0] = '0';  
  5. buffer[1] = 'x';  
  6. buffer[10] = '\0';  
  7. char* temp = buffer + 2;  
  8. for (int i=0; i < 8; i++)  
  9. {  
  10. temp[i] = (char)(num<<4*i>>28);  
  11. temp[i] = temp[i] >= 0 ? temp[i] : temp[i] + 16;  
  12. temp[i] = temp[i] < 10 ? temp[i] + 48 : temp[i] + 55;  
  13. }  
  14. return buffer;  
  15. }  


4. 将一个数字字符串转换为数字."1234" -->1234。
[cpp] view plaincopy
  1. int atoii(char* s)  
  2. {  
  3. assert(s!=NULL);  
  4. int num = 0;  
  5. int temp;  
  6. while(*s>'0' && *s<'9')  
  7. {  
  8. num *= 10;  
  9. num += *s-'0';  
  10. s++;  
  11. }  
  12. return num;  
  13. }  


5. 实现任意长度的整数相加或者相乘功能。
[cpp] view plaincopy
  1. void bigadd(char* num,char* str,int len)  
  2. {  
  3. for(int i=len;i>0;i--)  
  4. {  
  5. num[i] += str[i];  
  6. int j = i;  
  7. while(num[j]>=10)  
  8. {  
  9. num[j--] -= 10;  
  10. num[j] += 1;  
  11. }  
  12. }  
  13. }  


6. 不用递归实现斐波拉契数。
[cpp] view plaincopy
  1. int Funct( int n ) // n 为非负整数  
  2. int a=1; int b=1;  
  3. int c;  
  4. if(n==0 || n == 1)  
  5. return 1;  
  6. for(int i=1;i<n;i++)  
  7. {  
  8. c=a+b;  
  9. a=b; b=c;  
  10. }  
  11. return b;  
  12. }  


7. 用递归算法判断数组a[N]是否为一个递增数组。
递归的方法,记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回false结束:
[cpp] view plaincopy
  1. bool fun( int a[], int n )  
  2. {  
  3. if( n= =1 )  
  4. return true;  
  5. if( n= =2 )  
  6. return a[n-1] >= a[n-2];  
  7. return fun( a,n-1) && ( a[n-1] >= a[n-2] );  
  8. }  


8. 写一个函数找出一个整数数组中,第二大的数。
[cpp] view plaincopy
  1. const int MINNUMBER = -32767 ;  
  2. int find_sec_max( int data[] , int count)  
  3. {  
  4. int maxnumber = data[0] ;  
  5. int sec_max = MINNUMBER ;  
  6. for ( int i = 1 ; i < count ; i++)  
  7. {  
  8. if ( data[i] > maxnumber )  
  9. {  
  10. sec_max = maxnumber ;  
  11. maxnumber = data[i] ;  
  12. }  
  13. else  
  14. {  
  15. if ( data[i] > sec_max )  
  16. sec_max = data[i] ;  
  17. }  
  18. return sec_max ;  


9. 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序,这次要求用递归方法进行。
[cpp] view plaincopy
  1. Node * MergeRecursive(Node *head1 , Node *head2)  
  2. {  
  3. i ( head1 == NULL )  
  4. return head2 ;  
  5. if head2 == NULL)  
  6. return head1 ;  
  7. Node *head = NULL ;  
  8. if head1->data < head2->data )  
  9. head = head1 ;  
  10. head->next = MergeRecursive(head1->next,head2);  
  11. else  
  12. head = head2 ;  
  13. head->next = MergeRecursive(head1,head2->next);  
  14. }  
  15. return head ;  
  16. }  


10. 文件中有一组整数,要求排序后输出到另一个文件中。
[cpp] view plaincopy
  1. #include<iostream>  
  2. #include<fstream>  
  3. using namespace std;  
  4. void Order(vector<int>& data) //bubble sort  
  5. {  
  6. int count = data.size() ;  
  7. int tag = false ; // 设置是否需要继续冒泡的标志位  
  8. for ( int i = 0 ; i < count ; i++)  
  9. {  
  10. for ( int j = 0 ; j < count - i - 1 ; j++)  
  11. {  
  12. if ( data[j] > data[j+1])  
  13. tag = true ;  
  14. int temp = data[j] ;  
  15. data[j] = data[j+1] ;  
  16. data[j+1] = temp ;  
  17. }  
  18. }  
  19. if ( !tag )  
  20. break ;  
  21. }  
  22. }  
  23. int main( void )  
  24. {  
  25. vector<int>data;  
  26. ifstream in("c:\\data.txt");  
  27. if ( !in)  
  28. {  
  29. cout<<"file error!";  
  30. exit(1);  
  31. }  
  32. int temp;  
  33. while (!in.eof())  
  34. {  
  35. in>>temp;  
  36. data.push_back(temp);  
  37. }  
  38. in.close(); //关闭输入文件流  
  39. Order(data);  
  40. ofstream out("c:\\result.txt");  
  41. if ( !out)  
  42. {  
  43. cout<<"file error!";  
  44. exit(1);  
  45. }  
  46. for ( i = 0 ; i < data.size() ; i++)  
  47. out<<data[i]<<" ";  
  48. out.close(); //关闭输出文件流  
  49. }  


11. 输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码)
[cpp] view plaincopy
  1. #include <iostream>  
  2. using namespace std;  
  3. void main()  
  4. {  
  5. char a[50];memset(a,0,sizeof(a));  
  6. int i=0,j;  
  7. char t;  
  8. cin.getline(a,50,'\n');  
  9. for(i=0,j=strlen(a)-1;i <strlen(a)/2;i++,j--)  
  10. {  
  11. t=a[i];  
  12. a[i]=a[j];  
  13. a[j]=t;  
  14. }  
  15. cout < <a < <endl;  
  16. }  


12. 下面的代码有什么问题?
[cpp] view plaincopy
  1. void DoSomeThing(...)  
  2. {  
  3. char* p;  
  4. ...  
  5. p = malloc(1024); // 分配1K的空间  
  6. if (NULL == p)  
  7. return;  
  8. ...  
  9. p = realloc(p, 2048); // 空间不够,重新分配到2K  
  10. if (NULL == p)  
  11. return;  
  12. ...  
  13. }  


答案 p = malloc(1024); 应该写成: p = (char *) malloc(1024); 没有释放p的空间,造成内存泄漏。
13. 下面的代码有什么问题?并请给出正确的写法。
[cpp] view plaincopy
  1. void DoSomeThing(char* p)  
  2. {  
  3. char str[16];  
  4. int n;  
  5. assert(NULL != p);  
  6. sscanf(p, "%s%d", str, n);  
  7. if (0 == strcmp(str, "something"))  
  8. {  
  9. ...  
  10. }  
  11. }  


答案:sscanf(p, "%s%d", str, n); 这句改为: sscanf(p, "%s%d", str, &n);
14. 写出运行结果:
[cpp] view plaincopy
  1. {// test2  
  2. union V {  
  3. struct X {  
  4. unsigned char s1:2;  
  5. unsigned char s2:3;  
  6. unsigned char s3:3;  
  7. } x;  
  8. unsigned char c;  
  9. } v;  
  10. v.c = 100;  
  11. printf("%d", v.x.s3);  
  12. }  


运行结果:3
15. 用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数。
[cpp] view plaincopy
  1. 16位的系统下,  
  2. int i = 65536;  
  3. cout < < i; // 输出0;  
  4. int i = 65535;  
  5. cout < < i; // 输出-1;  
  6. 32位的系统下,  
  7. int i = 65536;  
  8. cout < < i; // 输出65536;  
  9. int i = 65535;  
  10. cout < < i; // 输出65535;  


16. 试编写函数判断计算机的字节存储顺序是开序(little endian)还是降序(bigendian) 。
[cpp] view plaincopy
  1. bool IsBigendian()  
  2. {  
  3. unsigned short usData = 0x1122;  
  4. unsigned char *pucData = (unsigned char*)&usData;  
  5. return (*pucData == 0x22);  
  6. }  


17. 简述Critical Section和Mutex的不同点。
答:
⑴ Critical Section
A.速度快
B.不能用于不同进程
C.不能进行资源统计(每次只可以有一个线程对共享资源进行存取)
⑵ Mutex
A.速度慢
B.可用于不同进程
C.不能进行资源统计
⑶ Semaphore
A.速度慢
B.可用于不同进程
C.可进行资源统计(可以让一个或超过一个线程对共享资源进行存取)
⑷ Event
A.速度慢
B.可用于不同进程
C.可进行资源统计
18. 用C 写一个输入的整数,倒着输出整数的函数,要求用递归方法。
[cpp] view plaincopy
  1. void fun( int a )  
  2. {  
  3. printf( "%d", a%10 );  
  4. a /= 10;  
  5. if( a <=0 )return;  
  6. fun( a );  
  7. }  


19. 写出程序结果:
void Func(char str[100])
{
printf("%d\n", sizeof(str));
}
答: 4
20. 请问运行Test函数会有什么样的结果?
[cpp] view plaincopy
  1. void GetMemory(char *p)  
  2. {  
  3. p = (char *)malloc(100);  
  4. }  
  5. void Test(void)  
  6. {  
  7. char *str = NULL;  
  8. GetMemory(str);  
  9. strcpy(str, "hello world");  
  10. printf(str);  
  11. }  


答:程序崩溃。
因为GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。strcpy(str, "hello world");将使程序崩溃
0 0