返回损坏值的方法

时间:2014-11-11 16:59:16

标签: c++

我回来时似乎得到了腐败的价值观。图像说明了循环的输出。

enter image description here

// loop
float *bo = getBoundaries(); // this calls the method displayed below
cout << "\ngetDisplay: " << bo[0];
// loop

float* getBoundaries()
{
    cout << "\ngetB: " << x1; // this displays the correct value
    float boundaries[4] = {};
    boundaries[0] = x1;
    boundaries[1] = x2;
    boundaries[2] = y1;
    boundaries[3] = y2;
    cout << "\nfinal: " << boundaries[0]; // this also displays the correct value
    return boundaries;
}

这种情况发生在我从调试模式更改为发布模式时,但现在它已经影响了调试和发布。

1 个答案:

答案 0 :(得分:4)

return boundaries;

使用指向超出范围的本地函数的指针是未定义的行为。当getBoundaries()返回时,boundaries本地超出范围,因此取消引用返回的指针可以执行任何操作,包括使程序崩溃。

由于数组不能通过值返回但结构可以返回,因此一个选项是返回包含数组的结构:

struct boundaries {
    float v[4];
};

boundaries getBoundaries() {
    boundaries b;

    b.v[0] = x1;
    b.v[1] = x2;
    b.v[2] = y1;
    b.v[3] = y2;

    return b;
}

// Then in your loop:
boundaries bo = getBoundaries();
cout << "\ngetDisplay: " << bo.v[0];

你也可以返回std::vector<float>或(如果你有C ++ 11),那么最好的选择是std::array<float, 4>