以良好的方式返回指针

Returning a pointer in a good way

本文关键字:返回 指针 方式      更新时间:2023-10-16

这段代码是完全有效的吗?在这里返回指针不会让我们陷入未定义的行为吗?

#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就无效。 访问它是未定义的行为。