繁体   English   中英

很好地返回指针

[英]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该指针将无效。 访问它是未定义的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM