#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.我的代码出了什么问题?
答案 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
,但可能不会。{有时也可能会说p
和q
是相同的,有时不是。
克里斯的评论中的链接有一个不错的解释。
答案 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;
}