网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 大学论文导航 设计下载 最新论文 下载排行 原创论文 论文源代码
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > C/C++ > 正文

c++返回局部变量的指针

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 14/07/08

文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。网学的各位小编整理了C/C++-c++返回局部变量的指针的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!

  函数返回指针。本来就是一个比较容易出问题的操作。在霍顿的《VC++ 入门经典》一书中,给出了一个很有代表性的例子,如下:

  // Ex5_11.cpp

  #include <iostream>

  using std::cout;

  using std::endl;

  double* treble(double); // Function prototype

  int main(void)

  {

  double num = 5.0; // Test value

  double* ptr = 0; // Pointer to returned value

  ptr = treble(num);

  cout << endl

  << "Three times num = " << 3.0*num;

  cout << endl

  << "Result = " << *ptr; // Display 3*num

  cout << endl;

  system("pause");

  return 0;

  }

  // Function to treble a value - mark 1

  double* treble(double data)

  {

  double result = 0.0;

  result = 3.0*data;

  return &result;

  }

  两个输出语句,一个直接输出3*5=15.另一个在一个函数中进行了乘法运算,也是5*3, 存到result变量中也没有任何问题。返回这个变量的指针,输出时再接触引用。貌似也没有错误。两条输出语句似乎都应该输出15.但事实不是这样。编译 器会抛出[Warning] address of local variable `result'' returned 这样一个警告信息。程序运行后的结果也并非是我们预想的那样。第二条输出语句会输出一个不可预见的值。这是怎么回事呢?

  仔细分析一下,result是作用域在treble函数中的局部变量。当函数执行结束后。变量result会被析构。其原先占用的内存区域已经被系统回收,可以存储任何数据。而返回的指向该地址的指针也失去了其原有的意义。因此我们得到这样一条准则:

  永远不要从函数中返回局部自动变量的地址。

  如果你真的需要这样操作。你可以在函数的参数表中传入一个指针变量。然后将需要写入的数据写入到该指针变量指向的地址。由于该指针指向的变量,作用域在函数体 之外。因此不会在函数结束结束时被回收。

  现在回到我们遇到的问题。时间函数localtime就是一个返回指针的函数。返回值类 型:tm*

  该如何接收这个返回值?当然是声明一个与之类型相同的变量。

  于是你会这样写:tm* result;

  接下来呢?还用问?赋值嘛。是不是这样:result=localtime(....);

  返回什么类型,当然要给什么类型的变量 赋值。但是这样却发生了我们不想看到的结果。

  也许你想到了。就是这个指针!返回的指针在函数结束后不再有效。正确的方法可以是:

  tm result;

  result = *localtime(....);

  也可以是:

  tm* result;

  *result = *localtime(...);

  正确的方法的共同特点是在函数结束前,对返回的指针解除引用。然后用这个数值,为变量或指针指向的内存区域赋值。也就是说必须要复制函 数的返回值。因为函数体中变量会被析构。

  指针是灵活而强大的,避免低级错误,明确基本概念。才能让指针更好的为我们服务。

网学推荐

免费论文

原创论文

设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号