【问题标题】:Returning an array address from a function to a pointer (C++)将数组地址从函数返回到指针(C++)
【发布时间】:2014-03-30 10:17:36
【问题描述】:

下面引用了我的家庭作业。以防我看错了什么。

“在一个名为 PointerPractice.cpp 的文件中,编写一个名为 concatArrays 的函数,该函数接受两个 int 数组 作为参数并将两个数组连接成函数创建的第三个更大的数组。 该函数应仅使用指针算术(无数组表示法)并应返回指向 新创建的数组。该函数应具有以下原型: int* concatArray(int* pArray1, int size1, int* pArray2, int size2)。

在您的主要功能中:

  1. 创建两个大小为 8 和 10 的 int 数组。
  2. 使用循环,用随机数填充两个数组。每个随机数都应该在 范围 0 到 9(含)。
  3. 打印两个数组,并带有一些注释,指示正在打印哪个数组。
  4. 现在调用 concatArray,将两个随机数组及其大小作为参数。
  5. 使用指针,保存对从 concatArray 返回的数组的引用。
  6. 最后,打印返回的数组,并带有一些注释,表明它是生成的数组 来自 concatArray。”

当我从函数本身打印时,它会正确打印出来。当我尝试在 main 中打印它时,它会打印出每个地址的随机数字字符串,而不是 0-9 的单个数字。

功能:

int* concatArray(int* pArray1, int size1, int* pArray2, int size2)
{
    int newArray[size1+size2];

    for(int i=0; i<size1+size2; i++)
    {
        if(i>size1)
        {
            *(newArray+i) = *(pArray2+i-size1);
        }

        else
        {
            *(newArray+i) = *(pArray1+i);
        }
    }

    cout<<endl;

    for(int i=0; i<size1+size2; i++)
    {
        cout << *(newArray+i)<<endl;
    }

    return newArray;

我在 main 中调用函数的地方:

ptrConcatArray = concatArray(myArray1, size1, myArray2, size2);

    cout <<endl;
    cout << "Resultant array:" << endl;

    for(int i=0; i<size1; i++)
    {
        cout << *(ptrConcatArray+i)<<endl;
    }

【问题讨论】:

  • 您不能在函数中声明一个变量,然后将其按值返回给调用者,但您可以将其副本或地址返回到非本地的内存空间(如堆)对象。

标签: c++ arrays function pointers


【解决方案1】:

您正在返回一个指向本地数组的指针。到函数返回时,数组已被销毁,使指针悬空(即,未指向任何有效对象)。

您应该返回std::vector&lt;int&gt;,这是一个可正确复制的动态数组(与内置数组类型不同),并自动管理数组的内存。

如果您的分配禁止使用标准库(就像它说“使用指针”时那样),那么也许您可以返回一个指向使用 new 分配的数组的指针:

int * newArray = new int[size1+size2];

这是一个坏主意,因为它让调用者有责任在完成后删除数组;但可能发生的最坏情况是内存泄漏,而不是返回悬空指针所导致的内存损坏和未定义行为。

【讨论】:

  • 非常感谢!这就是我认为我的教授希望我做的事情。忘记了新的运算符。
【解决方案2】:

int newArray[size1+size2];是局部变量,不能是返回值。

int newArray = new int[size1+size2]; 应该没问题。

【讨论】:

  • 感谢您的回答!帮我找出解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 2011-07-19
  • 1970-01-01
相关资源
最近更新 更多