1

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

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

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

4

3 回答 3

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

另一种方法是声明kstatic. 静态变量存储在某个地方的永久存储器中,而不是堆栈上,因此它们的地址在程序的整个生命周期内保持有效。

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;
}
于 2013-01-31T04:26:22.870 回答
1

int k 将在函数返回时被删除。因此,我将指向内存的未分配部分。错误

于 2013-01-31T04:26:01.793 回答
1

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

于 2013-01-31T04:26:03.507 回答