0

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

    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

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

4

3 回答 3

2

您正在返回一个指向数组的指针,该数组是getBasicArray函数的局部变量。它是一个悬空指针,取消引用它是未定义的行为。您可以尝试返回 anstd::array或 an std::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;
}
于 2013-10-12T08:02:23.473 回答
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); 
}
于 2013-10-12T08:07:21.200 回答
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;
}
于 2013-10-12T08:22:24.527 回答