0

以下代码正在打印垃圾值。我将一个数组传递给一个向每个元素添加 5 的函数,但是当它返回该数组的指针时,主要显示垃圾。

我已经在 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();
}
4

3 回答 3

2

theArrayadd5ToEveryElement()是返回给 main()的函数中的一个本地数组。这是未定义的行为。

最低限度您可以更改此行:

int theArray[5];

到:

int *theArray = new int[5];

它会正常工作的。delete稍后在 main() 中不要忘记它。因为你修改了原始指针,保存它:

int *arr = add5ToEveryElement(noArr, size);
int *org = arr;
// Rest of the code

//Finally

 delete[] org;
于 2012-12-23T09:00:10.120 回答
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;
    }
}

那么您的 main 将使用两个数组参数调用,如果您希望使用与输入和输出相同的参数,它也会这样做。

当然,这不完全是您问题的答案,但它为您的问题提供了“更好”的解决方案。

我通常不喜欢函数中的分配——尤其是“隐藏”分配(这个函数说它向每个元素添加 5,而不是“向每个元素添加 5 的分配数组”。代码永远不应该做令人惊讶的事情,分配内存有点如果您只要求为每个元素添加 5,这将是一个惊喜)

于 2012-12-23T10:24:42.053 回答
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;
}
于 2012-12-23T10:32:29.420 回答