指针例题的分析-----void getmemory( char *p ){ p = (char *) malloc( 100 );} void test( void ){ char *str =

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);

》》》》》》》》本文章为个人学习记录之用,如有错误望大家告知,谢谢!《《《《《《《《

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值