函数返回数组但主要显示垃圾

时间:2012-12-23 08:54:38

标签: c++ arrays function pointers return

以下代码正在打印垃圾值。我将一个数组传递给一个函数,该函数为每个元素添加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();
}

3 个答案:

答案 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;
}