c++ - 如何通过函数参数返回指向不规则数组的指针?
问题描述
我需要修改现有的 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;
}
解决方案
在发布的代码中,您正在取消引用未初始化的指针。这就是未定义行为的原因。
解决方案是:
- 创建一个类型的变量
int**
。 - 将该变量的地址传递给函数。
int **ppX2;
mx.getMxByArg(&ppX2);
另一种选择是将参数类型更改为int**&
.
void getMxByArg(int**& ppX) {
ppX = m_ppMx;
}
然后,您可以使用:
int **ppX2;
mx.getMxByArg(ppX2);
推荐阅读
- java - 如何使弹簧批处理步骤执行与可配置的线程数并行?
- php - WP All Import Pro 功能更改日期和时间格式(从导入的 .CSV)
- php - Laravel custom unique validation with Rule
- html - Angular Material Tab - How to change label font size
- python-3.x - What to do when python don't want to run a previous working program?
- mysql - Required context properties mismatch in connecting the flink with mysql database
- c - 两个假定相同的变量以某种方式持有不同的值
- ios - [iOS][FoursquareAPI] ERROR: [connection] nw_resolver_start_query_timer_block_invoke
- reactjs - 如何更改反应选择上的下拉指示器位置
- java - Spring Scheduler:在使用 cron 和启动时运行一次之间切换