C++返回指针

C++ returning pointer

本文关键字:指针 返回 C++      更新时间:2023-10-16
#include <iostream>
using namespace std;
int* createArray();
int main() {
    int *arr = createArray();
    cout << "Main: " << arr << endl;
    arr[0] = 0;
    arr[1] = 1;
    cout << arr[0] << endl;
    cout << arr[1] << endl;
}
int* createArray() {
    int arr[2];
    cout << "createArray()1: " << arr << endl;
    return arr;
}

我不明白为什么如果我只称这个声明

cout << arr[0] << endl;

cout << arr[1] << endl;

可以显示正确的值。但是如果我同时调用这两个语句,它将显示

createArray()1: 00AFFAF4
Main: 00AFFAF4
0
11533068  //Don't show 1

createArray返回的指针指向不存在的对象。当函数返回时,本地数组被销毁。当你在main中取消引用悬空指针时,程序的行为是未定义的。

解决方案:永远不要返回对局部变量的指针或引用。在这种情况下,例如,您可以返回数组的副本。您不能按值返回原始数组,但可以返回包装器结构,如 std::array<int, 2>

您返回一个指向局部变量的指针,该指针在功能块结束时被销毁。

但请注意,当您使用 new 运算符时,您需要在其他地方使用 delete(至少不使用智能指针)。

溶液:

int* createArray() {
    int* arr = new int[2];
    // your code
    return arr;
}