没有得到所需的输出

时间:2015-03-13 19:06:42

标签: c++ syntax

#include  <iostream>

using namespace std;

int *GetSquare(int x)
{
    int y = x;

    y = y * y;
    return &y;
}

int main()
{
    const int n = 4;
    int *p[n];

    for (int j = 0; j < 2; ++j)
    {
        p[2 * j + 1] = new int[2];

        for (int i = 0; i < 2; ++i)
            p[2 * j + 1][i] = 2 * j + 1;
    }
    p[0] = GetSquare(2);
    p[2] = GetSquare(4);

    for (int j = 0; j < n; ++j)
    {
        for (int i = 0; i < 1; ++i)
            cout << p[j][i] << " ";
        cout << endl;
    }
    return 0;
}

当我干这个代码时,我得到输出“4 1 16 3”。 而在编译器中我得到“16 1 3 3” 没有办法,我可以找到第一个输出为16.我的代码出了什么问题?

2 个答案:

答案 0 :(得分:2)

此:

int *GetSquare(int x)
{
    int y = x;
    y = y * y;
    return &y;
}

非常糟糕的事情

您正在返回堆栈上的值的地址,一旦离开该函数,该地址就会失效。 一旦您离开该功能,您就无法依赖该地址的生活。

你写道:

p[0] = GetSquare(2);

并且您可能认为p[0]是指向值为4的整数的指针。除非指针仅在GetSquare内有效。

这个问题看起来很糟糕。为什么不从GetSquare返回实际的整数值,而不是指向无效内存地址的指针?

int GetSquare(int x) { return x * x; }

编辑: 这个问题可以简化为:

int* GetSquare(int x)
{
    int y = x;
    y = y * y;
    return &y;
}

int main()
{
    int* p = GetSquare(2);
    int* q = GetSquare(4);
    cout << "p == q? " << (p == q ? "YES" : "NO") << endl;
    cout << p << " " << q << " " << endl;
    return 0;
}

在调试模式下运行,在发行版中运行,具有各种级别的调试信息和/或优化...您可能有时会获得4 16,但可能不会。{有时也可能会说pq是相同的,有时不是。

克里斯的评论中的链接有一个不错的解释。

答案 1 :(得分:0)

您的ptogram具有未定义的行为,因为您正在返回指向函数的本地对象的指针,该函数将在退出后将被销毁。

int *GetSquare(int x)
{
    int y = x;

    y = y * y;
    return &y;
}

返回指针而不是临时对象也没有意义。该函数可以写成

long long int GetSquare( int x )
{
    return ( long long int )x * x;
}