检查下面代码有什么问题?
1
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( str );
}
问题
传入中GetMemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的实参值,执行完后的str仍然为NULL;
char *str = NULL;
GetMemory( str );
- 函数的形参为字符串指针,在函数内部修改形参值并不能真正的改变实参值。在函数中malloc重新为形参申请了一段内存,使得形参指向新的内存,而实参str依然为NULL。也可以这样理解:main函数中的指针p作为形参传递,会产生指针的拷贝p_cpy传入GetMemory函数中;即传入GetMemory的指针如果是一级指针的话,所分配的内存的地址是给拷贝的指针p_cpy,而不是给p;如果使用二级指针传递,pp作为形参,会产生指针的拷贝pp_cpy,此时pp和pp_cpy都是指向p,所分配的内存的地址自然也就可以传递给*pp(即p)啦!
- 在函数GetMemory中和Test中没有malloc对应的free,造成内存泄露 .
修改后的代码
#include <iostream>
using namespace std;
//传值调用
void GetMemory( char **p )
{
*p = (char *) malloc( 100 );
}
//引用调用
void GetMemory_1(char *&p)
{
p = (char *) malloc (100);
}
int main()
{
char *str = NULL;
char *str1 = NULL;
GetMemory( &str );
GetMemory_1( str1 );
strcpy( str, "hello world" );
strcpy( str1, "hello world1" );
cout<<str<<endl;
cout<<str1<<endl;
free(str);
free(str1);
str=NULL;
str1=NULL
return 0;
}