返回指针
Returning a pointer
我不明白这个例子是如何工作的:
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;
}
相关文章:
- 在 const 函数中通过引用和指针返回之间的区别
- 指向 std::unrodered_map 中元素的指针返回'Read access violation'
- 为什么要为指针返回类型返回一系列字符?
- Visual C 运行时:Malloc将指针返回到已经使用的内存(包含实际字符串)
- 将原始指针返回到智能指针
- 从函数中的指针返回对象,例如链接列表
- 将指针返回使用New创建的数组数组
- 查找并将指针返回向量中的对象
- 函数可以将指针返回其自己的类型
- 指针返回值的地址
- 为什么静态指针返回函数中有一个"静态"键?
- 从弱指针返回类型返回共享指针
- 如何将C++引用和指针返回转换为 C++/CLR
- 从指针返回对象时出现意外的析构函数调用
- 阵列指针返回垃圾
- (C )当在同一类中调用时,污点指针返回正确的值,而从MAIN调用时为0
- C 从指针返回到成员功能
- 在构造函数以外的任何其他位置访问相机时,我的相机指针返回 null
- 从取消引用的指针返回原始指针
- 指针返回