gpt4 book ai didi

c++ - 以一种好的方式返回一个指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:27:21 24 4
gpt4 key购买 nike

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

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

关于c++ - 以一种好的方式返回一个指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14618449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com