如何在c ++中访问在另一个函数中创建的数组?

时间:2018-04-23 09:08:51

标签: c++ arrays function

#include <stdio.h>
#include <iostream>

using namespace std;

int* arr_test(int);

int main()
{
int n;
cin>>n;

int *new_arr;

new_arr=arr_test(n);

for (int i=0;i<n;i++)
  new_arr[i]++;

for(int i=0;i<n;i++)
  cout<<"new array "<< new_arr[i]<<endl;

return 0;
}

int* arr_test(int n)
{
int arr[n];

for (int i=0;i<n;i++)
  cin>>arr[i];
for(int i=0;i<n;i++)
  cout<<"old array "<< arr[i]<<endl;

return arr;
}

输出:

  

2
  20个
  10个
  旧阵列20
  旧阵列10
  分段错误

我知道为什么我得到分段错误,因为我正在访问不存在的内存,我的意思是只有arr_test函数的范围的数组。但我想得到那个阵列。我试过&#34;静电&#34;但是它说arr [n]并不是一成不变的。我可以把它变成全球性的,但我的大小是&#39; n&#39;必须得到用户。我该如何访问该阵列?如果你有另一种方法来获取它,请发布它但记住约束arr大小必须是用户给定的,数组必须在arr_test函数中。在此先感谢:)

3 个答案:

答案 0 :(得分:1)

返回一个数组int arr[n];,该数组在离开函数范围后被销毁。

尝试返回在内存中分配的数组:

int* arr_test(int n)
{
    int* arr = new int[n];

    for (int i=0;i<n;i++)
        cin>>arr[i];
    for(int i=0;i<n;i++)
        cout<<"old array "<< arr[i]<<endl;

    return arr;
}

但是之后需要通过delete [] new_arr;

删除已分配的内存

此外,您可以使用数组引用来使用自动内存中的数组:

void arr_test2(int arrByReference[], int n)
{
    for (int i=0;i<n;i++)
        cin>>arrByReference[i];
    for(int i=0;i<n;i++)
        cout<<"old array "<< arrByReference[i]<<endl;
}

//...
int array[n];
arr_test2(array,n); 

在这种情况下,您无需删除内存。当array将留下范围

时,它将被删除

答案 1 :(得分:1)

在函数arr_test中,局部变量arr[n]被放置在堆栈中,但用作返回值。
当函数返回时,堆栈被清除 如果要将局部变量用作返回值,则应确保在函数返回时不清除它 这可以通过将局部变量声明为static int arr[n];来获得。

答案 2 :(得分:0)

在惯用的C ++中,int的动态数组发音为std::vector<int>,而不是int[]using namespace std;许多名称引入全局范围,并且是微妙错误的处方。

#include <iostream>
#include <vector>

std::vector<int> arr_test(int);

int main()
{
    int n;
    cin>>n;

    auto new_arr = arr_test(n);

    std::for_each(new_arr.begin(), new_arr.end(), [](int & val){ ++val; });

    std::for_each(new_arr.begin(), new_arr.end(), [](int val){ std::cout << "New array" << val << std::endl; });

    return 0;
}

std::vector<int> arr_test(int n)
{
    std::vector<int> arr(n);

    std::copy_n(std::istream_iterator<int>(std::cin), n, new_arr.begin());

    std::for_each(new_arr.begin(), new_arr.end(), [](int val){ std::cout << "Old array" << val << std::endl; });

    return arr;
}