代码之家  ›  专栏  ›  技术社区  ›  Gio

如何通过函数参数返回指向不规则数组的指针?

c++
  •  0
  • Gio  · 技术社区  · 8 年前

    我需要修改现有的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;
    }
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   R Sahu    8 年前

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

    解决办法是:

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

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

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

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

    然后,您可以使用:

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