5

我不明白这个例子是如何工作的:

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

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

}

salary是 中的局部变量GetSalary(),因此从函数返回后,此单元格可能会被另一个函数覆盖。我看不出返回一个指向局部变量的指针(不在堆上实例化)是如何工作的。

4

6 回答 6

16

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

于 2012-06-21T09:18:25.120 回答
8

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

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

为什么它似乎工作归结为实施。很可能内存没有被清除。因此,尽管您无权访问返回指针指向的内容,但在该内存中26.48仍然存在。但这只是偶然。

于 2012-06-21T09:19:35.040 回答
2
double * GetSalary()  
{   
     double salary = 26.48;    
     return &salary; 
}  
double dummy_function()
{
     double a = 1.1;
     double b = 2.2;
     double c = 0 , d = 0;

     c = a + b - d;
     return c;  
}

main() 
{     
     double *a;
     a = GetSalary();
     cout << dummy_function();
     cout << *a;  //this time it wont print 26.48
} 

因为函数堆栈已被第二个函数调用覆盖dummy_function

于 2012-06-21T09:43:13.873 回答
1

它不起作用,它取消引用不再有效的指针。指向的内存恰好保持预期值并不是程序作为一个整体“工作”或正确的标志。

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

于 2012-06-21T09:19:57.587 回答
0

它是一个悬空指针,它调用未定义的行为
在某些系统上,它可能会使您的应用程序崩溃,而在其他系统上,它可能会正常工作。但无论哪种方式,你都不应该这样做。
看到这个类似的 SO 帖子

于 2012-06-21T09:23:43.397 回答
0

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

double * GetSalary()  {
  static double salary = 26.48; 
  return &salary;
}
于 2012-06-21T17:42:19.660 回答