返回指向对象数组的指针

时间:2017-07-21 01:06:13

标签: c++ arrays pointers scope

我无法返回指向对象数组的指针,特别是如何定义返回类型,我只是无法获得指针返回...

month* year()
{
    month* p;

    month arr[12] = { month(31), month(28), month(31), month(30),  month(31), month(30), month(31), month(31), month(30), month(31), month(30), month(31) };

    p = arr;

    return p;
}

我也一直在试验,我担心即使我让它返回,我还可以从主要访问对象吗?这只允许我访问我选择的第一个元素(不是第一个元素,我首先尝试访问),并且不会给我内容:

int** createArray()
{
    int n1 = 1;
    int n2 = 2;
    int n3 = 3;

    int* p[3];

    p[0] = &n1;
    p[1] = &n2;
    p[2] = &n3;

    int** j = p;

    return j;
}

int main()
{
    int** point = createArray();
    *point[2] = 5;
    cout << *point[1] << endl;
    cout << *point[2] << endl;
}

更新:我应该提到我必须在我的课程中使用此项目中的数组和指针。我理解我的(愚蠢的)关于局部变量的错误,但即使我把它变成一个类,我对返回类型也有同样的问题:

class create {
public:
    month* GetArr();
    create();
private:
    month arr[12];
    month* arrP;

};

create::create(){
    month arr[12] = { month(31), month(28), month(31), month(30), month(31), month(30), month(31), month(31), month(30), month(31), month(30), month(31)};
    month* arrP = arr;
}

month* create::GetArr()
{
    return arrP;
}

2 个答案:

答案 0 :(得分:1)

您遇到的问题是您返回指向本地对象的指针,并且一旦您的函数结束该对象就会被销毁,因此指针指向垃圾。

month* year()
{
    month* p;
    month arr[12] = { month(31), month(28), month(31), month(30),  month(31), month(30), month(31), month(31), month(30), month(31), month(30), month(31) };
    p = arr;
    return p;
}

year()结束后,arr无效。您想要使用的是std::vector

std::vector<month> year()
{
    std::vector<month> months = { month(31), month(28), month(31), month(30),  month(31), month(30), month(31), month(31), month(30), month(31), month(30), month(31) };
    return months;
}

现在,您将把容器退回所有月份:

struct month
{
     month(int d) : days(d) {}
     int numberOfDays() const { return days; }
 private:
     int days;
};

int main()
{
    auto months = year();
    for (auto m : months)
        std::cout << "Days in month: " << m.numberOfDays() << std::endl;
}

答案 1 :(得分:0)

如何归还记忆没有问题。问题是您返回的指针指向在该函数的局部变量空间(称为其堆栈帧)中创建的变量。当您退出该函数时,该堆栈帧被“销毁”,您将无法再访问它。实际上它实际上并没有被破坏,这就是为什么你可以访问它(但这是非常危险的)。要解决这个问题,你必须创建一些不在函数堆栈框架内的内存,然后返回指向它的指针。

以下是动态记忆的一些很好的解释:

more to the point

better explanation