返回一个指针

时间:2012-06-21 09:17:45

标签: c++ pointers

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

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

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

}

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

6 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:8)

您正在遇到未定义的行为,这意味着任何事情都可能发生。包括出现在工作中。

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

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

答案 2 :(得分: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

覆盖

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

dangling pointer调用undefined behaviour 在某些系统上它可能会使您的应用程序崩溃,而在其他系统上它可能会正常工作。但无论哪种方式,你都不应该这样做 见this similar SO post

答案 5 :(得分:0)

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

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