0
点赞
收藏
分享

微信扫一扫

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

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 条评论