以良好的方式返回指针

时间:2013-01-31 04:23:59

标签: c++

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

#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;
}

编辑:有效代码的外观如何?

3 个答案:

答案 0 :(得分:7)

不,先生。那是无效的。您无法返回指向局部变量的指针。一旦lab()退出k不存在,并且取消引用指向它的指针会导致未定义的行为。

考虑存储k的位置。您获取地址的自动变量存储在堆栈中。输入函数时堆栈会增大,退出时会收缩。当lab()返回时,分配给k的堆栈空间被回收并且可以被运行时重用,可能还用于其他一些函数中的其他局部变量。

有几种方法可以解决这个问题。最简单的方法是让调用者提供存储值的位置,而不是让lab()尝试查找空间。这消除了k返回时lab()被解除分配的问题。

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;
}

答案 1 :(得分:1)

函数返回时将删除

int k。因此,我将指向一个未分配的内存部分。 ERROR

答案 2 :(得分:1)

不,它无效。 lab返回指向变量局部变量的指针。 lab存在后,该指针无效。访问它是未定义的行为。