我不明白这个例子是如何工作的:
double * GetSalary() {
double salary = 26.48;
return &salary;
}
main() {
cout << *GetSalary(); //prints 26.48
}
salary
是GetSalary()
中的局部变量,因此在从函数返回后,此单元格可能会被另一个函数覆盖。
我不知道返回一个指向局部变量的指针(在堆上没有实例化)是如何工作的。
答案 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;
}