【问题标题】:How to return array in C++?如何在 C++ 中返回数组?
【发布时间】:2010-09-20 12:05:17
【问题描述】:

为什么下面的代码不起作用?

它编译得很好,但是如果我使用* 编写f,则输出类似于地址,如果我编写f 而不使用*,则输出为0

#include <iostream>
#include<cstring>
using namespace std;
using std::size_t;
int *f(size_t s){
    int *ret=new int[s];
     for (size_t a=0;a<s;a++)
          ret[a]=a;
      return ret;
      }
int main(){

    size_t s=20;
    cout<<*f(s)<<endl;

    return 0;
}

【问题讨论】:

  • 它应该做什么?
  • 你已经在这里问了十几个问题,还不知道如何格式化代码?是什么让您无法看到编辑框旁边的提示?
  • 为什么你认为这不起作用?据我所知,它应该工作得很好。
  • ...当然,您发布的代码存在堆内存泄漏(因为您从未delete[]),但我怀疑这是您最不关心的问题。

标签: c++ arrays return


【解决方案1】:

您使用的是 C++,只需使用 std::vector 代替,它可以简化一切:

#include <iostream>
#include <vector>

std::vector<int> f(size_t s){
    std::vector<int> ret( s );
     for (std::size_t a=0;a<s;a++)
          ret[a]=a;
      return ret;
      }
int main(){

    std::size_t s = 20;
    std::vector<int> v = f(s);
    for( std::vector<int>::iterator it = v.begin(); it != v.end(); ++it ) // go through each element
        std::cout<< *it << std::endl;

    for( int idx = 0; idx != v.size(); ++idx ) // simpler variant that is equivalent in this example
        std::cout<< v[idx] << std::endl;


    return 0;
}

【讨论】:

  • 这遗漏了几个 std:: 前缀。尽管如此,+1 来自我。这是新手唯一明智的选择。
  • 啊,是的,在复制粘贴问题中的代码后忘记修复这个问题......现在应该修复了。
  • 我也+1,但是,很多时候,家庭作业要求不接触标准容器 - 从经验来看。
  • 我不认为这是作业,只是认为提问者正在寻找一种从函数返回“数组”的方法。
【解决方案2】:

函数f(s)返回动态分配数组的地址。

如果你这样做 cout&lt;&lt;f(s)&lt;&lt;endl; 它将打印该地址,如果您执行cout&lt;&lt;*f(s)&lt;&lt;endl;,它将打印索引0 处的值,即0

如果你想打印整个数组,运行一个循环:

int *p = f(s);
for (size_t a=0;a<s;a++) {
    cout<<*(p+a)<<endl;
}

【讨论】:

    【解决方案3】:

    f(s) 返回一个 int* 所以 *f(s) 是一个 int(分配数组的第一项),值为 0。这就是它应该出现的样子,只是一个 0

    【讨论】:

      【解决方案4】:

      正如@frag 所说,main() 对f(s) 的类型一无所知,只是它是一个指向int 的指针。它没有任何理由寻找其他 19 个整数。

      你的 main 函数应该看起来更像这样:

      int main(){
      
          size_t s=20;
          int *p = f(s);
          for (size_t i=0; i<s; i++)
            cout<<*(p+i)<<endl;
      
          return 0;
      }
      

      【讨论】:

        【解决方案5】:

        代码分成两行更容易理解:

        int* ret = f(s);
        cout<<*ret<<endl;
        

        *ret == ret[0] == 0。因此,它为您发布的代码打印 0。

        *注意,您正在分配一个数组(使用 new),但从不释放它。

        如果您的意图是打印数组中的所有元素,可以使用以下代码:

        size_t s=20; 
        int* ret = f(s);
        for (size_t i = 0; i < s; i++)
            cout<< ret[i] << " ";
        delete[] ret;
        

        【讨论】:

        • delete ret 正在调用未定义的行为,它应该是 delete[] ret
        • 谢谢。相应地修正了答案。
        【解决方案6】:

        从函数中获取数组的最佳方法是将引用作为输入参数(即传入指向数组开头的指针),然后在函数完成后,传递的数组in 将由函数填充。我什至不建议尝试退货。

        另一种选择是类似于 STL Vector (http://www.cplusplus.com/reference/stl/vector/) 类或类似变体,可以返回,但它实际上取决于您打算将其用于什么。

        【讨论】:

        • 这是一个动态分配的数组。代码应该可以正常工作。
        • 我总是被教导返回在函数中创建的数组是不好的做法。这似乎有点乱。
        • 啊,我明白你的意思了。好的,是的,支持 codaddict。
        【解决方案7】:

        您不能使用&lt;&lt; 运算符来输出数组。您必须创建一个for 循环并打印每个条目。

        f 的输出保存到变量并打印每个条目。

        【讨论】:

          猜你喜欢
          • 2020-03-23
          • 2014-11-22
          • 2011-12-07
          • 2022-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多