首页 > 解决方案 > 找不到悬空指针?

问题描述

我不确定这里的悬空指针在哪里,我的意思是它是一个数组而不是指针。它在我的考试中,答案是一个悬空指针?我真的很困惑,我认为当指针指向外部和数组范围时会发生悬空指针?

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

标签: c++arraysfunctionpointersfor-loop

解决方案


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.


推荐阅读