我不明白这个例子是如何工作的:
double * GetSalary() {
double salary = 26.48;
return &salary;
}
main() {
cout << *GetSalary(); //prints 26.48
}
salary
是 中的局部变量GetSalary()
,因此从函数返回后,此单元格可能会被另一个函数覆盖。我看不出返回一个指向局部变量的指针(不在堆上实例化)是如何工作的。
它不起作用。这是未定义的行为。它似乎可行,因为“正确的行为”是“任何可能的行为”的子集。
您遇到了未定义的行为,这意味着任何事情都可能发生。包括看起来工作。
在函数之外,返回指针是悬空的(即它指向的内存是无效的)。
为什么它似乎工作归结为实施。很可能内存没有被清除。因此,尽管您无权访问返回指针指向的内容,但在该内存中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;
}