【问题标题】:Function returning array but main showing garbage [duplicate]函数返回数组但主要显示垃圾[重复]
【发布时间】:2012-12-10 04:35:43
【问题描述】:

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

【问题讨论】:

  • @Mat o no sir,它不是重复的,这是我面临的问题,搜索并没有帮助我
  • 同样的问题。您正在返回一个指向自动(基于堆栈)数组的指针。
  • 好吧,那个家伙没有像我一样使用索引是更新版本,而不是重复:P
  • @Asadullah 你有什么理由不使用std::vector 而不是数组吗?
  • @jogojapan 先生,没有理由,但我正在教别人数组如何工作以及它们如何传递给函数并从函数返回:)

标签: c++ arrays function pointers return


【解决方案1】:

theArray 是函数add5ToEveryElement() 中的一个本地数组,您将返回给main()。这是未定义的行为。

最低限度你可以改变这一行:

int theArray[5];

到:

int *theArray = new int[5];

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

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

//Finally

 delete[] org;

【讨论】:

  • int *theArray = new int[5];这不是本地化的吗??
  • @Asadullah 不。它是堆分配的数组,直到delete 明确显示。这就是为什么我更新以释放 main 中的内存。
  • 你是绝对正确的。现在关于内存泄漏??我该怎么办??
  • 我必须在 main 的末尾写 delete theArray ??还是什么??
  • 感谢大家的帮助。最后一件事,内存泄漏如何损坏我的系统或者如果内存泄漏会发生什么??
【解决方案2】:

从函数返回数组通常被认为是不好的。

除非您必须有一个“新”数组,否则我建议 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,这有点令人惊讶)

【讨论】:

    【解决方案3】:

    这是完美的代码

    # 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-20
      • 2023-02-06
      • 1970-01-01
      • 2020-01-08
      • 2013-10-30
      • 2014-06-06
      • 2013-03-19
      相关资源
      最近更新 更多