C/C++程序员应聘常见面试题深入剖析


以下是引用片段:
void strcpy( char *strDest, char *strSrc ) {
  while( (*strDest++ = * strSrc++) != ‘/0’ ); 

4分
以下是引用片段:

void strcpy( char *strDest, const char *strSrc ) {//将源字符串加const,表明其为输入参数,加2分
    while( (*strDest++ = * strSrc++) != ‘/0’ ); 


7分
以下是引用片段:
void strcpy(char *strDest, const char *strSrc) { //对源地址和目的地址加非0断言,加3分  

    assert( (strDest != NULL) &&(strSrc != NULL) ); 
    while( (*strDest++ = * strSrc++) != ‘/0’ );

10分
以下是引用片段:
//为了实现链式操作,将目的地址返回,加3分! 
char * strcpy( char *strDest, const char *strSrc ) {
    assert( (strDest != NULL) &&(strSrc != NULL) ); 
    char *address = strDest; 
    while( (*strDest++ = * strSrc++) != ‘/0’ ); 
    return address; 
}  
从2分到10分的几个答案我们可以清楚的看到,小小的strcpy竟然暗藏着这么多玄机,真不是盖的!需要多么扎实的基本功才能写一个完美的strcpy啊!

(4)对strlen的掌握,它没有包括字符串末尾的'/0'。

读者看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了,完美的版本为:
 

[cpp]  view plain copy
  1. int strlen( const char *str ) //输入参数const  
  2.   
  3. {  
  4.     assert( strt != NULL ); //断言字符串地址非0  
  5.     int len;  
  6.     while( (*str++) != '/0' )   
  7.     len++;   
  8.     return len;  
  9. }    

[cpp]  view plain copy
  1. //试题4:  
  2. void GetMemory( char *p ) {  
  3.     p = (char *) malloc( 100 );  
  4.   
  5. }  
  6. void Test( void ) {  
  7.     char *str = NULL;  
  8.     GetMemory( str );  
  9.     strcpy( str, "hello world" );  
  10.     printf( str );  
  11. }  
  12. //试题5:  
  13. char *GetMemory( void ) {  
  14.     char p[] = "hello world";  
  15.   
  16.     return p;  
  17. }  
  18. void Test( void ) {  
  19.     char *str = NULL;  
  20.     str = GetMemory();  
  21.     printf( str );  
  22. }   
  23.   
  24. //试题6:  
  25. void GetMemory( char **p, int num ) {  
  26.     *p = (char *) malloc( num );  
  27. }  
  28. void Test( void ) {  
  29.     char *str = NULL;  
  30.     GetMemory( &str, 100 );  
  31.     strcpy( str, "hello" );  
  32.     printf( str );  
  33. }   
  34.   
  35. //试题7:  
  36. void Test( void ) {  
  37.     char *str = (char *) malloc( 100 );  
  38.     strcpy( str, "hello" );  
  39.     free( str ); ... //省略的其它语句  
  40. }    


解答:

试题4传入中GetMemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完后的str仍然为NULL;

试题5中的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。

试题6的GetMemory避免了试题4的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句后未判断内存是否申请成功,应加上:
if ( *p == NULL ){...//进行申请内存失败处理}


试题7存在与试题6同样的问题,在执行
char *str = (char *) malloc(100); 
后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:
str = NULL;

剖析:
试题4~7考查面试者对内存操作的理解程度,基本功扎实的面试者一般都能正确的回答其中50~60的错误。但是要完全解答正确,却也绝非易事。

对内存操作的考查主要集中在:

(1)指针的理解;

(2)变量的生存期及作用范围;

(3)良好的动态内存申请和释放习惯。

再看看下面的一段程序有什么错误:

[cpp]  view plain copy
  1. //以下是引用片段:  
  2. swap( int* p1,int* p2 ) {  
  3.     int *p;   
  4.   
  5.     *p = *p1;  
  6.     *p1 = *p2;  
  7.     *p2 = *p;  
  8. }    


在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“Access Violation”。该程序应该改为:

以下是引用片段:
swap( int* p1,int* p2 ) { int p; p = *p1; *p1 = *p2; *p2 = p; } 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值