给初学者提个醒:C/C++函数里的指针参数也是按值传递的!

转自: http://blog.csdn.net/zhu_xz/archive/2007/10/30/1857133.aspx

刚在ChinaUnix.net上看到一个帖子:http://bbs.chinaunix.net/thread-1009233-1-1.html,作者自己写了个strcpy函数。别的就不看了,只看看函数的第一句话:

void   * strcpy( void   * dest , const   void   * src,size_t n)
... {
  
if (dest == NULL)
    dest
= ( char   *  )malloc(n);
//  ......
}

乍一看,这句话似乎没什么问题,甚至还做了参数判断,如果dest为空则为其分配空间。但是,问题就恰好出在这个画蛇添足的malloc上!

要知道,不管这个函数里面做了怎样的修改,在函数返回后,dest的值是绝对不会改变的!也就是说,如果传入的dest为NULL,那么在返回后,dest的值还是为NULL!并且,这样的空间分配,还会导致内存空间的泄漏!!

肯定有人会说:dest是一个指针,是按地址传值的,函数里面修改了,在函数返回后,其值会发生改变的。我要说,这样的理解是完全错误的,是你根本没有理解参数的本质!

在C/C++里,函数的参数值本身在调用前后的值是保持不变的,在函数体内部所做的任何修改,对函数体外的值没有任何的影响!即便是传递的指针,从本质来说,C/C++也是做了一次拷贝,将指针复制了一份传递给函数的!!!!

对于传递指针的情况,所修改的,不是该指针参数的值,而是该指针参数所指向的那个空间的值!可以看这么个简单的例子:

void  test( char *  arg)
{
    cout 
<<  hex  <<   " Address of arg in test() "   <<   & arg  <<  endl;
}

int  main( int  argc,  char **  argv)
{
    
char   * arg = 0 ;
    cout 
<<  hex  <<   " Address of arg in main() "   <<   & arg  <<  endl;
    test(arg);
    
return   0 ;
}

 

这段代码执行的结果为:

Address of arg  in  main(): 0012FF7C
Address of arg 
in  test(): 0012FF28

这段代码就可以解释我先前做出的结论:即便是指针传递,也是复制了一个指针给函数的,而绝不是操作的同一个东西!多注意程序的细节,才能写出bug更少,质量更高的代码!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值