【问题标题】:How can I return a pointer to an array in C++?如何在 C++ 中返回指向数组的指针?
【发布时间】:2011-12-25 13:00:23
【问题描述】:

这是我的简单代码 arrayfunc() 应该将一些数字存储在一个数组中,并返回这个数组的指针 到将打印数组内容的主函数 我的代码有什么问题? 它只返回指向数组第一个元素的指针 任何帮助将不胜感激。 提前致谢。


   #include <iostream>

   using namespace std;

   //The definition of the function should remain the same
   int* arrayfunc()
   {
    int *array[10];
    array[0] =new int;
    array[1] =new int;
    array[2] =new int;
    array[3] =new int;

    *array[0]=10;
    *array[1]=11;
    *array[2]=12;
    *array[3]=13;

    return  *array;

   }

   int main()
   {


    for(int i=0;i<4;i++)
    cout<<*(arrayfunc()+i)<<endl; 

     return 0;
   }

【问题讨论】:

标签: c++ arrays pointers


【解决方案1】:

(1) 如果你想返回它,你应该用new 分配你的数组:int* array = new int[10]; [假设这里你想要ints 的数组而不是int*s 的数组]
(2) 返回指向数组中第一个元素的指针,使用return array 而不是return *array
(3) 你的数组是指针数组,而不是整数数组。

【讨论】:

  • 已经用new分配了!返回数组在这里不起作用
  • @codeflow: 不,每个数组的item 分配有new,但不是整个 数组。
  • @codeflow: 元素是用new分配的,你应该用new分配array本身:int* array = new int[10];我会把它添加到我的答案中。
  • @codeflow:不客气。不要忘记accept您认为最有帮助的答案。
  • 如果数组超过 10 个元素,我们应该取消分配并分配一个新数组
【解决方案2】:

你的数组是在栈上分配的,所以一旦函数返回,它就会被释放。所以你想返回一个指向死内存的指针。

但您并没有这样做,您只是返回第 0 个数组项的有效(副本)值。

那么,你必须做什么:

  1. 最好的办法是切换到 stl 容器。您应该使用 std::vector 或类似的东西。
  2. 如果你坚持手动内存管理的想法,你必须在堆上分配数组,从函数中返回,也许在调用者中释放它。

编辑:
基本上你想要以下:

using namespace std;

vector<int> arrayfunc()
{
    vector<int> v;
    v.push_back(10);
    ...
    return v;
}

...

vector<int> result = arrayfunc();
cout << result[0] << ...

这将是正确的 C++ 方式。

(吹毛求疵:)您不需要关心复制向量,因为所有现代 C++ 编译器都使用 RVO。


在堆上分配数组也应该很简单:

int* array = new int[4];
array[0] = 10;
...
return array;

...
int* array = arrayfunc();
...
delete[] array;

但我强烈建议采用前一种方法(使用矢量)。

【讨论】:

  • 不,实际上他正在返回一个指向第一个 int 的指针,该指针是动态分配的,因为他的数组是一个指针数组。
  • 但是我给它分配了新的,它怎么可能在堆栈上?
  • 我想访问数组中的所有元素,而不仅仅是第一个
  • @amit:这基本上是我写的:第 0 个数组项是指针,因为数组是指针数组。
  • @Vlad:我的评论指的是您在编辑之前的回答。它只包含Your array is allocated on stack, so as soon as the function returns, it's freed. So you want to return a pointer to a dead memory.,这是错误的,因为他返回的内存非常有效,但不是他想要的。
【解决方案3】:

这个代码在我看来在几个层面上都是错误的。

  1. 永远不要返回函数的内部变量。变量数组只在函数中定义,千万不要在外面返回。

  2. 为什么你用 new 自己分配每个 int?我会立即分配整个数组。如果您知道数组长度并且它是常量,请考虑静态定义它。

【讨论】:

  • 我试图返回一个指向堆中分配的元素的指针。我们不知道数组的长度
  • int array[] = new int[10]; array[0] = 17; array[1] = 18; return array;
【解决方案4】:
【解决方案5】:

试试return array; 而不是return *array;

【讨论】:

  • 我相信它不会因为这个而失败:),他必须做一些初始化
  • @mrabooode - 查看array 的类型。它不是 int 的数组
  • 我很抱歉造成误解,但我在想如果它像return array 它将返回数组中第一个指针的地址,并且在函数之外他可以通过递增来迭代地址,他只需要初始化数组即可。
  • 问题是,分配在函数内部的数组在堆栈上。当函数返回时,数组变为无效并可能充满垃圾,BOOM 段错误。
猜你喜欢
  • 1970-01-01
  • 2011-02-07
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 2018-07-29
相关资源
最近更新 更多