夏普程序员笔试题和面试题答案目

夏普程序员笔试题和面试题答案目,第1张

试题1:

void test1()

{

char string[10]

char* str1 = "0123456789"

strcpy( string, str1 )

}

试题2:

void test2()

{

char string[10], str1[10]

int i

for(i=0i<10i++)

{

str1[i] = 'a'

}

strcpy( string, str1 )

}

试题3:

void test3(char* str1)

{

char string[10]

if( strlen( str1 ) <= 10 )

{

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) <= 10)应改为if(strlen(str1) <10),因为strlen的结果未统计’\0’所占用的1个字节。

考查对基本功的掌握:

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

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

(3)库函数strcpy的工作方式,

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

试题4:

void GetMemory( char *p )

{

p = (char *) malloc( 100 )

}

void Test( void )

{

char *str = NULL

GetMemory( str )

strcpy( str, "hello world" )

printf( str )

}

解答:

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

char *str = NULL

GetMemory( str )

后的str仍然为NULL

试题5:

char *GetMemory( void )

{

char p[] = "hello world"

return p

}

void Test( void )

{

char *str = NULL

str = GetMemory()

printf( str )

}

试题5中

char p[] = "hello world"

return p

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

试题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 )

}

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

*p = (char *) malloc( num )

后未判断内存是否申请成功,应加上:

if ( *p == NULL )

{

...//进行申请内存失败处理

}

试题7:

void Test( void )

{

char *str = (char *) malloc( 100 )

strcpy( str, "hello" )

free( str )

... //省略的其它语句

}

试题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

}

预处理器(Preprocessor)

1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。

#define MIN(A,B) ((A) <= (B)?(A) : (B)) 12

错误的地方:

一、4和5行,超出了byte类型的范围(-128~127);

二、全局整型变量x,y在声明时没有声明为static导致18,20,22行中用到变量x和y的地方都错了。不能在static块中引用非static成员。

三、check方法上可能看得出是返回一个boolean类型的变量,但是在程序中返回 *** 作都放在了if语句块中,那么如果没有一个if语执行的话,就没有返回值了,所以应该加上一个默认的返回值。。。

四、28,29行错误,那两个变量都是final的,当然不能再改变其值了。。。。。。

五、32,35行的case处,用case时,必须返回一个常量,整型,或是枚举类型,修改方法有两个,(1)上面不是定义了这两个整型的值吗,直接case 0,case 1,(2)在上面的定义处,加上final.

不妥的地方:

一、定义角色横坐标,角色纵坐标变量时,最好放到方法里面,因为你的角色可能有多个实例,每个实例会有自己的坐标,而static不是属于某个实例的,而是属于整个整的。所有的角色只能共用一对坐标,感觉不妥啊。。。其他全局变量也一样,可以再细考虑一下。。

二、多加点注释,,别人可能不会看check方法里几个if是干什么的,费时间(各人观点)。

不知道你学的是什么语言,自学的不知道你技术水平怎么样。你这样的情况最好找那种招生的,积累一下经验,也检验一下自己的学习效果。

说实话,包装是很重要,但是就算你面试成功了,到了单位你应付不了工作,单位照样会辞退你的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11360285.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存