#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函数中。在此先感谢:)
答案 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;
}