我不确定这里的悬空指针在哪里,我的意思是它是一个数组而不是指针。 那是我的考试,答案是悬空的指针?我真的很困惑,我以为当指针指向外部和数组作用域时会发生悬空指针?
#include <iostream>
using namespace std;
int * f (int n) {
int a[10];
for (int i = 0; i < 10; i++)
a[i] = i*n;
return a;
}
void main() {
int j, k;
int * p;
j = 12;
p = f(j);
for (k = 0; k < 10; k++) {
cout << p[k];
}
cout << endl;
}
答案 0 :(得分:0)
f()
返回一个指针a
,该指针是在其中本地分配的内存(实际上是在堆栈上),并在f()
返回时“释放”。
稍后(在p = f(j)
中)访问此内存实际上是访问一个悬空指针。
在这种情况下,我将更改代码,以便f()
将返回一个向量(使它的数据动态分配在堆上,并使用方括号运算符提供类似数组的随机访问) :
#include <iostream>
#include <vector>
std::vector<int> f(int n)
{
const size_t N = 10;
std::vector<int> a(N);
for (int i = 0; i < N; i++)
a[i] = i*n;
return a;
}
void main() {
const int j = 12;
std::vector<int> p = f(j);
for (int k = 0; k < p.size(); k++) {
std::cout << p[k];
}
std::cout << std::endl;
}
在一般情况下,当您想从函数返回指针时,请确保动态分配内存并以一种使调用者知道它负责释放内存的方式返回它。简而言之-返回std::unique_ptr
。