以良好的方式返回指针
Returning a pointer in a good way
这段代码是完全有效的吗?在这里返回指针不会让我们陷入未定义的行为吗?
#include <iostream>
using namespace std;
int* lab(int* i) {
int k=9;
i=&k;
return i;
}
int main(void) {
int* i=0;
cout << *lab(i) << endl;
return 0;
}
编辑:有效的代码是什么样子的?
不,先生。这是站不住脚的。不能返回指向局部变量的指针。一旦lab()
退出,k
就不存在,取消引用指向它的指针会导致未定义的行为。
考虑一下k
存储在哪里。您获取其地址的自动变量存储在堆栈中。堆栈在进入函数时增长,在函数退出时收缩。当 lab()
返回时,分配给k
的堆栈空间将被回收,并且可以由运行时重用,可能用于其他一些函数中的其他局部变量。
有几种方法可以解决此问题。最简单的方法是让调用方提供一个存储值的位置,而不是让lab()
尝试查找空间。这消除了lab()
返回时k
被释放的问题。
int* lab(int* i) {
*i = 9;
return i;
}
int main(void) {
int k;
cout << *lab(&k) << endl;
return 0;
}
另一种方法是将k
声明为 static
。静态变量存储在某个地方的永久存储中,而不是在堆栈上,因此它们的地址在程序的整个生命周期内保持有效。
int* lab() {
static int k=9;
return &k;
}
另一种方法是使用 new
在堆上分配内存。
int* lab() {
int* i = new int;
*i = 9;
return i;
}
int main(void) {
int* i = lab();
cout << *i << endl;
delete i;
return 0;
}
int k 将在函数返回时被删除。因此,我将指向内存的未分配部分。错误
不,它无效。 lab
返回指向变量局部变量的指针。 该指针一旦存在lab
就无效。 访问它是未定义的行为。
相关文章:
- 在函数中返回无符号字符数组,但不返回指针
- 为什么需要返回指针来利用协方差?
- 野牛如何在解析树中返回指针
- 何时返回指针与返回对象的一般经验法则?
- 为什么使用 std::istream_iterator 构造函数返回指针
- 为什么我不能直接从返回指针的函数返回对指针的引用?
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 为什么下面的代码段返回指针指向的值而不是指针的地址?
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 函数返回动态强制转换的指针,返回指针,就好像它根本没有被转换一样
- 从函数返回对指针的引用与返回指针相同?
- C++ 为什么访问数组中的元素会返回指针?
- 关于函数返回指针
- 返回指针或对私有成员的引用的替代方法
- 从函数返回指针
- 通过从当地的C风格阵列中返回指针来获取一个悬空的指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 为什么C 模板功能不支持返回指针
- 返回指针的语句 - 解释它是如何工作的以及为什么