【问题标题】:Is return *array; valid? [closed]是返回 *array;有效的? [关闭]
【发布时间】:2014-04-09 22:27:31
【问题描述】:

这样在 C++ 中返回指向数组的指针是否有效?

int* function(int n){
   int i;
   for(i = 0; i<=n ; i++){
       int array[i] = i;
   }
  return *array;
}

正确的方法是什么?

【问题讨论】:

  • 修正int* function()...
  • 您可以使用edit 进行更正,而不是发表评论。
  • 您能否确认您的示例旨在将 array 定义在 return 语句无法访问的范围内?
  • 有时有效,有时无效。就目前而言,您的问题模糊而广泛,无法准确回答。
  • 请选择一个更好的例子。你的代码根本不会编译。

标签: c++ c arrays function pointers


【解决方案1】:

您的代码甚至无法编译。如果您的意思是:

int *foo()
{
     int x[5] = { 0 };
     return x;
}

那么这段代码不正确,因为foo()返回时数组x不复存在,所以指针将不再指向有效存储。

选项有:

  • 让调用者分配空间,函数写入该空间
  • 返回一个包含数组的容器,例如 C++ 中的std::vector
  • 返回指向 C 中动态分配的数组的指针。调用者必须记住在完成后给它free

【讨论】:

    【解决方案2】:

    是和不是。是的,因为这是您应该退货的方式。不,因为您应该(并且必须)使用 new[] 运算符(或 malloc 函数)。所以基本上你应该写:

    int* function(int n){
     int i = 0;
     int *array = new int[n]; // or c-style malloc(n*sizeof(int))
     for(i = 0; i<=n ; i++){
      array[i] = i;
     }
     return array;
    }
    

    为什么?因为如果你用int array[i] 创建一个数组,它会在函数结束时“消失”(这都是关于变量范围的)。

    【讨论】:

    • 不,抱歉,这是个糟糕的建议。您应该在此处使用mallocnew
    • @KonradRudolph 你能详细说明原因吗?
    • @elwin013 简而言之,klmr.me/slides/modern-cpp/#1
    • @KonradRudolph 我不同意,指针还不错,但必须谨慎使用,如果你想安全起见,你可以使用智能指针,但根本不使用指针是有限制的。有时您需要数组,甚至是动态数组,尤其是当您想要序列化某些东西并且向量最近才获得数据方法时。此外,如果您需要用 C 编写一些东西(您永远不知道......),了解如何使用指针对您也有好处。
    • @Piotr 指针还不错,但指针的这种特殊用途总是不好的,也不例外。 “向量最近才获得数据方法”是什么意思?序列化与什么有什么关系?
    【解决方案3】:

    这样在 C++ 中返回指向数组的指针是否有效?

    没有。您的示例根本无法编译:

    error: ‘array’ was not declared in this scope
    

    http://ideone.com/h17cH1

    返回一个指向数组的指针是可以的,如果这个数组不是自动变量,那么函数返回后它仍然存在。例如:

    int* function(int n){
       int * array = new int[i]();
       return array;
    }
    

    虽然不漂亮,因为不清楚谁应该删除这个数组以及何时删除。

    【讨论】:

      猜你喜欢
      • 2014-08-08
      • 2018-09-10
      • 2018-08-16
      • 1970-01-01
      • 2020-12-06
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多