以下代码正在打印垃圾值。我将一个数组传递给一个函数,该函数为每个元素添加5,但当它返回该数组的指针时,main显示为垃圾。
我在main中尝试了索引和指针,但结果仍然相同。我该如何解决这个问题?
# 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();
}
答案 0 :(得分:2)
theArray
是函数add5ToEveryElement()
中的一个本地数组,您将返回main()。这是未定义的行为。
你最不能改变这一行:
int theArray[5];
为:
int *theArray = new int[5];
它会正常工作。不要忘记稍后在main()中delete
。您修改原始指针,保存它:
int *arr = add5ToEveryElement(noArr, size);
int *org = arr;
// Rest of the code
//Finally
delete[] org;
答案 1 :(得分:0)
从函数返回数组通常被认为是错误的。
除非你必须有一个“新”数组,否则我建议C和C ++中的典型情况是修改输入数组。如果CALLING函数想要有两个独立的数组,那么它可以通过制作它自己的副本来实现。或者,您可以编写代码以将两个数组传递到您的函数中,例如
void add5ToEveryElement(int arr[], int arr2[], int size)
{
for(int i=0; i<size; i++)
{
arr2[i] = arr[i] + 5;
cout<<theArray[i]<<endl;
}
}
然后你的主要调用两个数组参数,如果你想使用相同的输入和输出,它也会这样做。
当然,这不是您问题的答案,但它为您的问题提供了“更好”的解决方案。
我通常不喜欢函数中的分配 - 特别是“隐藏”分配(这个函数说它为每个元素添加5,而不是“为每个元素添加5分配数组”。代码永远不应该做出令人惊讶的事情,并且分配内存是一个如果您只要求为每个元素添加5,那就有点意外了)
答案 2 :(得分:0)
这是完美的代码
# 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;
}