首页 > 解决方案 > 如何通过函数参数返回指向不规则数组的指针?

问题描述

我需要修改现有的 API,基本上我唯一的选择是通过函数参数返回指向不规则数组的指针(这通常不是我个人的偏好)。我无法解决这个问题,并且在这部分代码中不断出现分段错误:

void getMxByArg(int ***pppX) {
    *pppX = m_ppMx; // SEGMENTATION FAULT HERE
}

我在下面提供了一个示例,它没有任何外部依赖项并封装了问题。

#include <stdint.h>
#include <iostream>

using namespace std;


class Mx {
public:
    Mx() {
        int *buff01 = (int*)malloc(3 * sizeof(int));
        int *buff02 = (int*)malloc(3 * sizeof(int));

        buff01[0] = 0;
        buff01[1] = 1;
        buff01[2] = 3;

        buff02[0] = 4;
        buff02[1] = 5;
        buff02[2] = 6;

        m_n = 2;
        m_ppMx = (int**)malloc(m_n * sizeof(int*));
        m_ppMx[0] = buff01;
        m_ppMx[1] = buff02;
    }

    ~Mx() {
        for (int i=0; i<m_n; ++i) {
            free(m_ppMx[i]);
        }
        free(m_ppMx);
    }

    int** getMx() {
        return m_ppMx;
    }

    void getMxByArg(int ***pppX) {
        *pppX = m_ppMx; // SEGMENTATION FAULT HERE
    }

private:
    int **m_ppMx;
    int m_n;
};

int main()
{
    Mx mx;

    // SUCCESS
    int **ppX = mx.getMx();

    // FAILURE, Results in segmentation fault in getMxByArg
    int ***pppX;
    mx.getMxByArg(pppX);

    return 0;
}

标签: c++

解决方案


在发布的代码中,您正在取消引用未初始化的指针。这就是未定义行为的原因。

解决方案是:

  1. 创建一个类型的变量int**
  2. 将该变量的地址传递给函数。

int **ppX2;
mx.getMxByArg(&ppX2);

另一种选择是将参数类型更改为int**&.

void getMxByArg(int**& ppX) {
    ppX = m_ppMx;
}

然后,您可以使用:

int **ppX2;
mx.getMxByArg(ppX2);

推荐阅读