【问题标题】:Not getting the required output [closed]没有得到所需的输出[关闭]
【发布时间】:2015-05-16 09:35:23
【问题描述】:
#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。我的代码有什么问题?

【问题讨论】:

  • 我注意到一件事:stackoverflow.com/questions/6441218/…
  • 请将您的标题更改为与您遇到的问题更相关的内容。 “没有得到正确的输出”几乎适用于任何软件错误。
  • 一个问题是您的GetSquare 正在返回一个指向GetSquare 本地变量的指针。那很糟。为什么不直接返回值?你是什​​么意思,当我试运行这段代码时......?它实际上应该做什么?
  • 他可能意味着调试,但我没有编辑它以防他意味着其他东西。 @lurker

标签: c++ syntax


【解决方案1】:

这个:

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 相同,有时则不同。

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

【讨论】:

  • main 中的一些代码随后也需要重构,因为 OP 依靠 GetSquare 返回指向该值的指针。
  • @lurker 非常正确......留给读者作为练习。 ;) 但说真的,最初的问题是相当......奇怪......几乎就像它是专门为在糟糕的时候对坏人做坏事而写的。乍一看,我不相信GetSquare 是其中唯一 不好的指针。 GetSquare 是一个明显的问题,但也许不是唯一的问题。
  • 全部正确。 :) 我只是在想是否有人在指出解决方案,指出明显的连锁效应是有帮助的,但我同意:为读者锻炼。问题和代码中有很多妖精。
  • 其余代码是安全
【解决方案2】:

您的 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2014-03-24
    • 2022-07-28
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 2015-04-06
    相关资源
    最近更新 更多