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

How to return a pointer to a ragged array through a function argument?

本文关键字:不规则 数组 指针 何通过 函数 参数 返回      更新时间:2023-10-16

我需要修改现有的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. 创建一个类型为int**的变量
  2. 将该变量的地址传递给函数

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

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

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

然后,您可以使用:

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