C++ 函数返回数组,但main显示垃圾
下面的代码正在打印垃圾值。我将一个数组传递给一个函数,该函数向每个元素添加5,但当它返回该数组的指针时,main显示的是垃圾 我尝试了索引和指针,但结果仍然相同。我怎样才能解决这个问题C++ 函数返回数组,但main显示垃圾,c++,arrays,function,pointers,return,C++,Arrays,Function,Pointers,Return,下面的代码正在打印垃圾值。我将一个数组传递给一个函数,该函数向每个元素添加5,但当它返回该数组的指针时,main显示的是垃圾 我尝试了索引和指针,但结果仍然相同。我怎样才能解决这个问题 # include <conio.h> # include <iostream> using namespace std; int * add5ToEveryElement(int arr[], int size) { int theArray[5]; for(int i
# include <conio.h>
# include <iostream>
using namespace std;
int * add5ToEveryElement(int arr[], int size)
{
int theArray[5];
for(int i=0; i<size; i++)
{
theArray[i] = arr[i] + 5;
cout<<theArray[i]<<endl;
}
return theArray;
}
void main()
{
const int size = 5;
int noArr[size];
for(int i=0; i<size; i++)
{
noArr[i] = i;
}
int *arr = add5ToEveryElement(noArr, size);
cout<<endl;cout<<endl;
for(int i=0; i<size; i++)
{
cout<<arr[i]<<endl;
}
cout<<endl;cout<<endl;cout<<endl;cout<<endl;
for(int i=0; i<size; i++)
{
cout<<*arr<<endl;
*arr++;
}
getch();
}
#包括
#包括
使用名称空间std;
int*add5ToEveryElement(int arr[],int size)
{
阵列内[5];
对于(int i=0;i,数组是返回main()的函数add5toeverylement()
中的本地数组。这是未定义的行为
您至少可以更改此行:
int theArray[5];
致:
它可以正常工作。不要忘记稍后在main()中删除它。既然修改了原始指针,请保存它:
int *arr = add5ToEveryElement(noArr, size);
int *org = arr;
// Rest of the code
//Finally
delete[] org;
从函数返回数组通常被认为是错误的
除非你必须有一个“新”数组,否则我建议C和C++中的典型情况是修改输入数组。如果调用函数想要有两个单独的数组,那么它可以通过自己的拷贝来完成。或者,你可以编写代码,使两个数组传递到你的函数中,例如
。
void add5ToEveryElement(int arr[], int arr2[], int size)
{
for(int i=0; i<size; i++)
{
arr2[i] = arr[i] + 5;
cout<<theArray[i]<<endl;
}
}
void add5ToEveryElement(int-arr[],int-arr2[],int-size)
{
对于(inti=0;i这是完美的代码
# include <conio.h>
# include <iostream>
using namespace std;
int * add5ToEveryElement(int arr[], int size)
{
int *theArray = new int[5];
for(int i=0; i<size; i++)
{
theArray[i] = arr[i] + 5;
cout<<theArray[i]<<endl;
}
return theArray;
}
void main()
{
const int size = 5;
int noArr[size];
for(int i=0; i<size; i++)
{
noArr[i] = i;
}
int *arr = add5ToEveryElement(noArr, size);
int *p = arr;
cout<<endl;cout<<endl;
for(int i=0; i<size; i++)
{
cout<<arr[i]<<endl;
}
cout<<endl;cout<<endl;cout<<endl;cout<<endl;
for(int i=0; i<size; i++)
{
cout<<*arr<<endl;
*arr++;
}
getch();
delete[] p;
}
#包括
#包括
使用名称空间std;
int*add5ToEveryElement(int arr[],int size)
{
int*theArray=newint[5];
对于(int i=0;i@Mato不,先生,这不是重复的这是我面临的问题,搜索没有帮助我解决这是同一个问题。您正在返回指向自动(基于堆栈)的指针那个家伙没有像我一样使用索引是更新版本,不是重复版本:P@Asadullah你不使用std::vector
代替数组有什么原因吗?@jogojapan没有,先生没有任何原因,但我正在教某人数组是如何工作的,以及数组是如何传递到函数和从函数返回的:)int*theArray=newint[5];这不是让它成为本地的???@Asadullah不。它是堆分配的数组,在显式删除它之前将一直处于活动状态。这就是为什么我更新以释放main中的内存。你完全正确。现在关于内存泄漏,我应该怎么做?我必须在main的末尾写delete数组?或者什么?谢谢大家的帮助.最后一件事,内存泄漏如何损坏我的系统,或者如果内存泄漏会发生什么??
# include <conio.h>
# include <iostream>
using namespace std;
int * add5ToEveryElement(int arr[], int size)
{
int *theArray = new int[5];
for(int i=0; i<size; i++)
{
theArray[i] = arr[i] + 5;
cout<<theArray[i]<<endl;
}
return theArray;
}
void main()
{
const int size = 5;
int noArr[size];
for(int i=0; i<size; i++)
{
noArr[i] = i;
}
int *arr = add5ToEveryElement(noArr, size);
int *p = arr;
cout<<endl;cout<<endl;
for(int i=0; i<size; i++)
{
cout<<arr[i]<<endl;
}
cout<<endl;cout<<endl;cout<<endl;cout<<endl;
for(int i=0; i<size; i++)
{
cout<<*arr<<endl;
*arr++;
}
getch();
delete[] p;
}