返回并传递数组以在C ++中运行

时间:2013-10-12 08:00:04

标签: c++ arrays

我正在尝试返回一个数组并将其传递给另一个函数:

    int* getBasicArray(){
        int amountArray[5];
        amountArray[0]=1;

        return amountArray;
    }
    void printArray(int (*amountArray)){
        cout <<amountArray[0]<<endl;
    }
int main() 
{
    int* test=getBasicArray();
    cout <<test[0]<<endl; //Prints 1
    printArray(test); //Prints 19354128

当我尝试将它传递给一个简单的打印功能时,不知何故,我的数组变得混乱了。我做错了什么?

3 个答案:

答案 0 :(得分:2)

您正在返回一个指向数组的指针,该数组是getBasicArray函数的局部变量。它是一个悬空指针,取消引用它是未定义的行为。您可以尝试返回std::arraystd::vector。这是使用std::array

的示例
std::array<int,5> getBasicArray()
{
    std::array<int, 5> amountArray;
    amountArray[0]=1;
    return amountArray;
}

接下来,相应地修改您的功能。这是std::array版本:

template <size_t N>
void printArray(const std::array<int,N>& amountArray)){
    std::cout << amountArray[0] << std::endl;
}

这是std::vector一个:

void printArray(const std::vector<int>& amountArray)){
    std::cout << amountArray[0] << std::endl;
}

答案 1 :(得分:2)

您正在返回一个指向临时本地对象的指针,该对象在退出该函数后正在销毁。

为什么不尝试std::vector并摆脱指针?

std::vector<int> getBasicArray()
{
   std::vector<int> amountArray(5);
   amountArray[0]=1;

   return amountArray;
}

void printArray(const std::vector<int> &arr)
{
   for (auto &x : arr)
        cout << x <<endl;
}

int main() 
{
    auto test = getBasicArray(); // std::vector<int> test =  getBasicArray();

    cout <<test[0]<<endl;

    printArray(test); 
}

答案 2 :(得分:0)

getBasicArray表现不佳,一旦返回指针就会指向垃圾。 如果您真的想要分配数组,则必须使用operator new[]

int* getBasicArray() {
    return new int[5];
}

请注意,您不再使用自动存储,并且如果希望释放使用的内存,则必须调用delete。

最简单的解决方案是,不要使用原始数组。它们存在固有的问题,例如,你不能获得数组中的元素数量,它们容易衰变等等。

备选方案是std::vectorstd::array。 当您在编译时知道数组的大小时使用后者,前者在运行时知道大小时使用。

在这种情况下,您知道编译时的大小,因此请使用std :: array。

std::array<int, 5> get_basic_array()
{
    std::array<int, 5> arr;
    arr[0] = 1;

    return arr;
}