没有得到所需的输出
#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.我的代码有什么问题?没有得到所需的输出
此:
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
,但可能不会。它有时也可能会说p
和q
是相同的,有时不是。
克里斯的评论中的链接有一个体面的解释。
'main'中的一些代码随后需要重构,因为OP正在依靠'GetSquare'返回指向该值的指针。 – lurker 2015-03-13 19:14:00
@lurker非常真实......留给读者阅读。 ;)但是,严肃地说,原来的问题是......非常奇怪......几乎就像它写在坏人身上的那些坏的东西一样。乍一看,我不相信'GetSquare'是那里唯一*不好的指针。 'GetSquare'是一个明显的问题,但也许不是唯一的问题。 – 2015-03-13 19:18:34
全部都是如此。 :)我只是想,如果有人指出一个解决方案,指出明显的连锁效应是有帮助的,但我同意:为读者锻炼。问题和代码中有许多妖精。 – 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;
}
有一两件事我注意到:http://*.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris 2015-03-13 19:08:34
请将您的标题改为与您遇到的问题更相关的内容。 “没有得到正确的输出”几乎适用于任何有史以来的软件错误。 – Borgleader 2015-03-13 19:08:51
一个问题是你的'GetSquare'返回一个指向'GetSquare'本地的变量的指针。那很糟。你为什么不回传价值?你是什么意思,*当我干这个代码... *?它实际上应该做什么? – lurker 2015-03-13 19:10:29