C++ 返回指针

C++ 返回指针,c++,pointers,C++,Pointers,我不明白这个例子怎么可能起作用: double * GetSalary() { double salary = 26.48; return &salary; } main() { cout << *GetSalary(); //prints 26.48 } double*GetSalary(){ 双薪=26.48; 回报与薪酬; } main(){ cout它不起作用。它是未定义的行为。它似乎起作用,因为“正确的行为”是“任何可能的行为”的子集。你

我不明白这个例子怎么可能起作用:

double * GetSalary()  {
  double salary = 26.48; 
  return &salary;
}

main() {
    cout << *GetSalary();  //prints 26.48

}
double*GetSalary(){
双薪=26.48;
回报与薪酬;
}
main(){

cout它不起作用。它是未定义的行为。它似乎起作用,因为“正确的行为”是“任何可能的行为”的子集。

你遇到了未定义的行为,这意味着任何事情都可能发生。包括看起来起作用

在函数外部,返回指针悬空(即它指向的内存无效)

为什么它能工作归结于实现。很可能内存没有被清除。因此,尽管您无法访问返回指针指向的内容,但在该内存中,
26.48
仍然存在。但这只是偶然的。它不“工作”,它正在取消对不再有效的指针的引用。指向的内存恰好包含预期值,这并不是程序整体“工作”或正确的标志

要理解它为什么会工作,您需要分析发生的堆栈帧移位的确切模式,这有点烦人,并且非常依赖于编译器。

这是一个调用的函数。
在某些系统上,它可能会使您的应用程序崩溃,在另一些系统上,它可能会正常工作。但无论如何,您都不应该这样做。
请参阅。

double*GetSalary()
{   
双薪=26.48;
回报与薪酬;
}  
双伪函数()
{
双a=1.1;
双b=2.2;
双c=0,d=0;
c=a+b-d;
返回c;
}
main()
{     
双*a;
a=GetSalary();

cout这也可以,但更安全。它在多线程程序中无法正常工作

double * GetSalary()  {
  static double salary = 26.48; 
  return &salary;
}

是的,它可能被覆盖。也可能不被覆盖。这就是为什么这被称为未定义行为,而不是保证崩溃的原因。有趣的是,当我谷歌“从函数返回指针”时,obove代码是第一个结果我经常会遇到同样的情况。我有一个想法,当你使用谷歌帐户登录时,谷歌会改变你的搜索泡泡。@larsmans:我的问题是在不同的浏览器(即未登录谷歌/stackoverflow)上的第一个结果(几分钟后)!@VinayakGarg:好的,那么我只是有点偏执:)
double * GetSalary()  {
  static double salary = 26.48; 
  return &salary;
}