返回指针

Returning a pointer

本文关键字:指针 返回      更新时间:2023-10-16

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

double * GetSalary()  {
  double salary = 26.48; 
  return &salary;
}
main() {
    cout << *GetSalary();  //prints 26.48
}

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

不起作用。这是未定义的行为。它似乎有效,因为"正确的行为"是"任何可能的行为"的一个子集。

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

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

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

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

覆盖

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

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

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

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

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