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

Return And Pass Array to function in C++

本文关键字:C++ 运行 数组 返回      更新时间:2023-10-16

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

    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

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

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

你为什么不尝试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); 
}

您返回一个指向数组的指针,该数组是 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;
}
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;
}