c++ - 找不到悬空指针?
问题描述
我不确定这里的悬空指针在哪里,我的意思是它是一个数组而不是指针。它在我的考试中,答案是一个悬空指针?我真的很困惑,我认为当指针指向外部和数组范围时会发生悬空指针?
#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;
}
解决方案
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
.
推荐阅读
- javascript - Laravel Fullcalendar 实现 - 问题:改用 moment().utcOffset
- c# - 将函数作为函数参数传递
- java - 无法通过 selenium 中的 htmlunit 驱动程序运行脚本
- bash - API页码参数循环
- three.js - 三种 JS 中粒子的不同 Sprite
- amazon-ec2 - Packer 出现问题:amazon-ebs: Timeout waiting for SSH
- concrete5 - 在 Concrete5 中动态填充下拉列表
- python - OpenCV 函数在被 C++ 线程程序调用的 Python 脚本调用时锁定
- r - 具有自相关残差的时间序列的直线(预测包中的 auto.arima)
- html - 响应式引导材料的问题:剩余空间过多