1. malloc和free
下面代码会出现什么问题?
void GetMemory( char **p, int num )
{
*p = (char *) malloc( num );
}
void Test( void )
{
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, "hello" );
printf( str );
}
参考答案
(1) 传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句
*p = (char *) malloc( num );
后未判断内存是否申请成功,应加上:
if ( *p == NULL )
{
//进行申请内存失败处理
}
(2) 未释放堆内存
free(str);
str=NULL;
(3) printf(str) 改为 printf("%s",str)
,否则可使用格式化字符串攻击
2. swap
看看下面的一段程序有什么错误?
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=NULL;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
还是错误,错在形参并没有改变实参的值。
改为
swap( int* p1,int* p2 )
{
int p= *p1;
*p1 = *p2;
*p2 = p;
}
这样是可以的。
同
swap (int &num1, int &num2)
{
int p=num1;
num1=num2;
num2=p;
}