一道关于二级指针传参的问题

下面代码有什么问题?

void GetMemory( char *p )
{
       p = (char *) malloc( 100 );
}
void Test( void )
{
       char *str = NULL;
       GetMemory( str );  
       strcpy( str, "hello world" ); 
       printf( str ); 
}

解释:

1、GetMemory函数的参数应该用二级指针;

2、main函数中的指针p作为形参传递,会产生指针的拷贝p_cpy传入GetMemory函数中;即传入GetMemory的指针如果是一级指针的话,所分配的内存的地址是给拷贝的指针p_cpy,而不是给p;

3、如果使用二级指针传递,pp作为形参,会产生指针的拷贝pp_cpy,此时pp和pp_cpy都是指向p,所分配的内存的地址自然也就可以传递给*pp(即p)啦!

以上三点仅是说明str并没有分配到内存,是NULL;编译出错。


修改后:

void GetMemory( char **p )
{
       *p = (char *) malloc( 100 );
       assert(*p!=NULL);                  //判断是否申请上
} 
void Test(void)
{    ......
      GetMemory( &str );                 //str已经是个指针,&str就是二级指针;
      ......
      if(str)
      {
           free(str);                   //有malloc就有free;
           str=NULL;                    //避免成为野指针
      }
}


 
 


 

修改后:

形参改为**p、分配的地址传给*p、传过去的参数为&str、判断是否申请内存成功以及free释放置空指针


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值