关闭

C/C++函数里的指针参数也是按值传递的!

发表于:2013-1-09 09:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:zhongguoren666    来源:51Testing软件测试网采编

  刚在网上上看到一个帖子,作者自己写了个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更少,质量更高的代码!

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号