没有得到所需的输出

问题描述:

#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” theres没有办法在哪里我可以找到第一个输出是16.我的代码有什么问题?没有得到所需的输出

+7

有一两件事我注意到:http://*.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris 2015-03-13 19:08:34

+5

请将您的标题改为与您遇到的问题更相关的内容。 “没有得到正确的输出”几乎适用于任何有史以来的软件错误。 – Borgleader 2015-03-13 19:08:51

+2

一个问题是你的'GetSquare'返回一个指向'GetSquare'本地的变量的指针。那很糟。你为什么不回传价值?你是什​​么意思,*当我干这个代码... *?它实际上应该做什么? – lurker 2015-03-13 19:10:29

此:

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

克里斯的评论中的链接有一个体面的解释。

+0

'main'中的一些代码随后需要重构,因为OP正在依靠'GetSquare'返回指向该值的指针。 – lurker 2015-03-13 19:14:00

+0

@lurker非常真实......留给读者阅读。 ;)但是,严肃地说,原来的问题是......非常奇怪......几乎就像它写在坏人身上的那些坏的东西一样。乍一看,我不相信'GetSquare'是那里唯一*不好的指针。 'GetSquare'是一个明显的问题,但也许不是唯一的问题。 – 2015-03-13 19:18:34

+0

全部都是如此。 :)我只是想,如果有人指出一个解决方案,指出明显的连锁效应是有帮助的,但我同意:为读者锻炼。问题和代码中有许多妖精。 – lurker 2015-03-13 19:22:04

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