【问题标题】:Returning an array from a function to main in c++在c ++中将数组从函数返回到main
【发布时间】:2020-09-19 05:16:45
【问题描述】:

如何将这个数组返回给主函数,以便在我的程序中进一步使用?

int* enterMarks(int marks) {

int arr[marks];
cout << "Please enter " << marks << "marks (0<=Mark<=100):" << endl;

for (int i = 0; i < marks; i++) {
    cout << i+1 << ">";
    cin >> arr[i];
}
cout << "Thank you..." << endl;

return *arr;

【问题讨论】:

  • 请改用std::vector。您可以像返回任何其他对象一样返回一个。
  • 打开编译器的警告。它应该能够警告你这个错误。
  • 您不应该返回对本地(堆栈)声明变量的引用或指针。返回指向存储在堆上的值的指针或副本。
  • 不可能从 C++ 中的函数返回数组。在您的代码中,您已将函数定义为返回 int*,它是指针而不是数组。请改用std::vector&lt;int&gt;。可以从函数返回向量。
  • 这能回答你的问题吗? How to return an array from a function?

标签: c++ arrays vector dynamic-memory-allocation smart-pointers


【解决方案1】:

您不应返回指向您在函数的本地范围内定义的变量的指针,即在您的情况下为arr

改为返回std::vector 的副本。

#include <vector>


vector<int> enterMarks(int marks) {
  vector<int> arr;
  cout << "Please enter " << marks << "marks (0<=Mark<=100):" << endl;
  for (int i = 0; i < marks; i++) {
    cout << i+1 << ">";
    int mark;
    cin >> mark;
    arr.push_back(mark);
  }
  cout << "Thank you..." << endl;

  return arr;
}

要在 main 中打印这些值,您只需执行以下操作。

vector<int> arr = enterMarks(marks);
for (int i = 0; i < arr.size(); i++) {
  cout << "Mark " << i << " = " << arr[i] << endl;
}

【讨论】:

  • 你能给我一个例子,说明如何在主函数中打印这个数组。我还没学过向量。
  • 用一个例子更新了答案:)
【解决方案2】:

对于像这样的初学者可变长度数组

int* enterMarks(int marks) {

int arr[marks];
//...

不是标准的 C++ 功能。在 C++ 中,数组的大小应该是编译时常量。

其次,函数返回的指向具有自动存储持续时间的本地数组的指针将具有无效值,因为退出函数后本地数组将不再存在。

你需要有一个动态分配的数组。

您可以使用智能指针std::unique_ptr 来指向动态分配的数组,如下面的演示程序所示。

#include <iostream>
#include <memory>

std::unique_ptr<unsigned int[]> enterMarks( size_t marks ) 
{
    const unsigned HIGH_MARK = 100;

    auto arr = std::make_unique<unsigned int[]>( marks );

    std::cout << "Please enter " << marks 
              << " marks (0<=Mark<=" << HIGH_MARK << "):" << std::endl;

    for ( size_t i = 0; i < marks; i++ ) 
    {
        std::cout << i+1 << "> ";
        std::cin >> arr[i];
    }

    std::cout << "Thank you..." << std::endl;

    return arr;
}

int main() 
{
    size_t n = 10;

    auto arr = enterMarks( n );

    for ( size_t i = 0; i < n; i++ )
    {
        std::cout << arr[i] << ' ';
    }
    std::cout << '\n';

    return 0;
}

程序输出可能看起来像

Please enter 10 marks (0<=Mark<=100):
1> 10
2> 20
3> 30
4> 40
5> 50
6> 60
7> 70
8> 80
9> 90
10> 100
Thank you...
10 20 30 40 50 60 70 80 90 100 

或者你可以使用如下所示的标准类模板std::vector。

#include <iostream>
#include <vector>

std::vector<unsigned int> enterMarks( size_t marks ) 
{
    const unsigned HIGH_MARK = 100;

    std::vector<unsigned int> arr( marks );

    std::cout << "Please enter " << marks 
              << " marks (0<=Mark<=" << HIGH_MARK << "):" << std::endl;

    for ( size_t i = 0; i < marks; i++ ) 
    {
        std::cout << i+1 << "> ";
        std::cin >> arr[i];
    }

    std::cout << "Thank you..." << std::endl;

    return arr;
}

int main() 
{
    size_t n = 10;

    auto arr = enterMarks( n );

    for ( size_t i = 0; i < n; i++ )
    {
        std::cout << arr[i] << ' ';
    }
    std::cout << '\n';

    return 0;
}

程序输出可能与上面显示的方式相同。

注意,对有符号整数类型int的数组进行maje没有太大意义。最好使用无符号整数类型unsigned int

【讨论】:

    【解决方案3】:
    int arr[marks];
    

    这是一个局部变量,所以你不能返回它,否则行为未定义,导致崩溃等。

    你有两个选择

    1) 在堆中分配数组并返回

    int *arr = (int *)malloc(sizeof(int)*marks);
    ...
    return arr;
    

    然后你必须在调用函数中free arr。

    2) 更好,使用 C++ 向量并返回它

    std::vector<int> arr;
    ...
    cin >> mark;
    arr.push_back(mark);
    ...
    return arr;
    

    这样您就不必记住释放堆内存。

    【讨论】:

    • 你能给我一个例子,说明我如何在主函数中打印这个数组。我还没学过向量。
    猜你喜欢
    • 2014-06-20
    • 2021-09-21
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2011-06-30
    • 2015-07-18
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多