1.题目
以下代码有问题吗?如果有,是什么问题,怎么改正?
void getmemory( char *p )
{
p = (char *) malloc( 100 );
}
void test( void )
{
char *str = null;
getmemory( str ); //复制传递
strcpy( str, "hello world" );
puts( str );
}
2.正确答案:
void getmemory( char **p ) //*p改为**p,形参也要设置为二级指针即**p,&str通过地址传递给**p
{
*p = (char *) malloc( 100 ); //p改为*p
}
void test( void )
{
char *str = NULL;
getmemory( &str ); //str改为&str,地址传递,函数getmemory函数得到str的地址,&str为二级指针
strcpy( str, "hello world" );
puts( str );
}
3.分析
函数getmemory中,malloc申请的内存地址给了p指针,但是这个指针是一个局部变量,不会影响到函数test中的指针str。所以在test函数中使用strcpy和puts时,str指向的地址是随机的,会导致程序崩溃以及未知错误。
getmemory( str );这句采用的是复制传递,在函数中改变形参的值不会影响实参。因此需要改成地址传递,即getmemory( &str );
同时函数也需要改一下,改为void getmemory( char **p ){*p = (char *) malloc( 100 );}。此时str的得到内容即为malloc申请的地址。使用地址传递时,函数getmemory函数得到的是str的地址。str本身就是一个空指针,str存的是一个空地址。因此此时&str为二级指针,getmemory的形参也要设置为二级指针即**p。此时&str通过地址传递给**p,str就等于*p,因为要给str赋值malloc开辟的新空间返回主函数test,即*p=(char *)malloc(100);
》》》》》》》》本文章为个人学习记录之用,如有错误望大家告知,谢谢!《《《《《《《《