C/C++程序员常见面试题一


Posted in 面试题 onDecember 08, 2012
试题1:
void test1()
{
char string[10];
char* str1 = “0123456789″;
strcpy( string, str1 );
}

试题2:
void test2()
{
char string[10], str1[10];
int i;
for(i=0; i {
str1[i] = ‘a’;
}
strcpy( string, str1 );
}

试题3:
void test3(char* str1)
{
char string[10];
if( strlen( str1 ) {
strcpy( string, str1 );
}
}
试题1字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界;

对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;

对试题3,if(strlen(str1)
剖析:

考查对基本功的掌握:

(1)字符串以’\0’结尾;

(2)对数组越界把握的敏感度;

(3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:

2分
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函数了,完美的版本为: int strlen( const char *str ) //输入参数const
{
assert( strt != NULL ); //断言字符串地址非0
int len;
while( (*str++) != ‘\0′ )
{
len++;
}
return len;
}

试题4:
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}

void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, “hello world” );
printf( str );
}

试题5:
char *GetMemory( void )
{
char p[] = “hello world”;
return p;
}

void Test( void )
{
char *str = NULL;
str = GetMemory();
printf( str );
}

试题6:
void GetMemory( char **p, int num )
{
*p = (char *) malloc( num );
}

void Test( void )
{
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, “hello” );
printf( str );
}

试题7:
void Test( void )
{
char *str = (char *) malloc( 100 );
strcpy( str, “hello” );
free( str );
… //省略的其它语句
}

解答:

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

后的str仍然为NULL;

试题5中
char p[] = “hello world”;
return p;

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

试题6的GetMemory避免了试题4的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句
*p = (char *) malloc( num );

后未判断内存是否申请成功,应加上:
if ( *p == NULL )
{
…//进行申请内存失败处理
}

试题7存在与试题6同样的问题,在执行
char *str = (char *) malloc(100);

后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:
str = NULL;

试题6的Test函数中也未对malloc的内存进行释放。

剖析:

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

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

(1)指针的理解;

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

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

再看看下面的一段程序有什么错误:
swap( int* p1,int* p2 )
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}

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

Tags in this post...

面试题 相关文章推荐
编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串
Jan 07 面试题
Java基础知识面试要点
Jul 29 面试题
神路信息Java面试题目
Mar 31 面试题
什么是"引用"?申明和使用"引用"要注意哪些问题?
Mar 03 面试题
什么是事务?为什么需要事务?
Jan 09 面试题
命名空间(namespace)和程序集(Assembly)有什么区别
Sep 25 面试题
介绍一下.net和Java的特点和区别
Sep 26 面试题
标记环介质访问控制协议
Mar 27 面试题
武汉瑞得软件笔试题
Oct 27 面试题
简述进程的启动、终止的方式以及如何进行进程的查看
Jul 12 面试题
什么是GWT的Entry Point
Aug 16 面试题
如何开发一个JQuery插件
Jul 28 面试题
"火柴棍式"程序员面试题
Mar 16 #面试题
C++:局部变量能否和全局变量重名
Mar 03 #面试题
JAVA和C++的区别
Oct 06 #面试题
C面试题
Oct 08 #面试题
东方通信股份有限公司VC面试题
Aug 27 #面试题
北承题目(C++)
May 16 #面试题
判断单链表中是否存在环
Jul 16 #面试题
You might like
用 PHP5 轻松解析 XML
2006/12/04 PHP
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
javascript 流畅动画实现原理
2009/09/08 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
jQuery常见开发技巧详细整理
2013/01/02 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
Node.js的文件权限及读写flag详解
2016/10/11 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
微信小程序WebSocket实现聊天对话功能
2018/07/06 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
2020/02/27 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
python添加菜单图文讲解
2019/06/04 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
如何搭建pytorch环境的方法步骤
2020/05/06 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
python中setuptools的作用是什么
2020/06/19 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
财产保全担保书范文
2014/04/01 职场文书
银行行长竞聘演讲稿
2014/04/23 职场文书
会计毕业生自荐书
2014/06/12 职场文书
单位工作证明范本
2015/06/15 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL