2014-02-27 115 views
2

我的作业分配在下面引用。万一我误读了一些东西。从一个函数返回一个数组地址到一个指针(C++)

“在一个称为PointerPractice.cpp文件,写入一个称为concatArrays函数,接受两个int阵列 作为参数和两个阵列连接成三分之一较大的阵列,该函数创建。 该函数应仅使用指针算术(无数组符号),并应返回一个指针 新创建的数组的函数应具有以下原型:。 INT * concatArray(INT * pArray1,INT尺寸1,INT * pArray2,INT size2个)

在你的主要功能:

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

当我从功能本身进行打印,其打印出正确的。当我尝试打印出主要的,它打印出每个地址,而不是一个单一的数字号码的随机字符串从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; 

当我在主调用函数:

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

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

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

你不能在函数中声明一个变量,然后通过值将其返回给调用者,但是你可以将它的一个副本或一个地址返回到像堆对象那样非本地的内存空间。 –

回答

2

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

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

如果您分配禁止使用标准库(因为它似乎当它说:“使用指针”),那么也许你可以返回一个指向与new分配的数组:

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

这是一个坏主意,因为它将责任放置在调用者上,以便在完成时删除该数组;但可能发生的最糟糕的情况是内存泄漏,而不是内存损坏和未定义的行为,您将通过返回悬挂指针获得该行为。

+0

非常感谢!这就是我认为我的教授要我做的事。忘了新操作员。 – Kaune

0

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

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

+0

感谢您的回答!帮助我找出解决方案。 – Kaune

相关问题