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是干什么的,费时间(各人观点)。
不知道你学的是什么语言,自学的不知道你技术水平怎么样。你这样的情况最好找那种招生的,积累一下经验,也检验一下自己的学习效果。说实话,包装是很重要,但是就算你面试成功了,到了单位你应付不了工作,单位照样会辞退你的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)