C++ 指向结构的指针的2D数组。内存访问问题

C++ 指向结构的指针的2D数组。内存访问问题,c++,C++,我正试图编写一个程序来计算一组工作的匈牙利方法:工人。 我知道如何编写程序的大部分代码,但我一直在加载矩阵。 我创建了一个用来存储信息的类,并创建了一个指向该类对象的二维指针数组。矩阵的每个条目都应包含分配给该Worker:Job组合的成本值 每次我尝试将成本加载到数组中的对象时,都会遇到内存访问冲突,我不知道为什么。任何帮助都将不胜感激。 谢谢 克里斯 使用名称空间std; 类别成本{ 国际成本; int fillRow; int-fillColumn; 公众: costPtr() { int

我正试图编写一个程序来计算一组工作的匈牙利方法:工人。 我知道如何编写程序的大部分代码,但我一直在加载矩阵。 我创建了一个用来存储信息的类,并创建了一个指向该类对象的二维指针数组。矩阵的每个条目都应包含分配给该Worker:Job组合的成本值

每次我尝试将成本加载到数组中的对象时,都会遇到内存访问冲突,我不知道为什么。任何帮助都将不胜感激。 谢谢 克里斯

使用名称空间std;
类别成本{
国际成本;
int fillRow;
int-fillColumn;
公众:
costPtr()
{
int fillRow=0;
int fillColumn=0;
成本=0;
}
无效填充成本(整数成本输入)
{
成本=成本投入;
}
int printCost()常量
{
退货成本;
}
};
无效填充矩阵(成本系数***矩阵、内部工人、内部工作);
void methodMain();
无效打印矩阵(成本系数***矩阵、内部工作人员、内部工作);
int main()
{
methodMain();
}
void methodMain()
{
国际工作、工人;
职业;
工人;
成本估算***矩阵=新成本估算**[工人];
for(int i=0;icostPtr**matrix

// An array of pointers
costPtr** matrix = new costPtr*[workers];

// Each element in the array is (a pointer to) another array
for (int i = 0; i < workers; i++)
    matrix[i] = new costPtr[jobs];
没有显式内存分配或指针


编辑:重读后,我发现您需要一个“2d指针数组”,因此
costPtr***矩阵
是正确的,但您还需要一个步骤:

costPtr*** matrix = new costPtr**[workers];
for (int i = 0; i < workers; i++) {
    matrix[i] = new costPtr*[jobs];
    for (int j = 0; j < jobs; j++) {
        matrix[i][j] = new costPtr;
    }
}
costPtr***矩阵=新costPtr**[工人];
for(int i=0;i
如果您希望它是一个“2d”矩阵,它应该是
costPtr**matrix

// An array of pointers
costPtr** matrix = new costPtr*[workers];

// Each element in the array is (a pointer to) another array
for (int i = 0; i < workers; i++)
    matrix[i] = new costPtr[jobs];
没有显式内存分配或指针


编辑:重读后,我发现您需要一个“2d指针数组”,因此
costPtr***矩阵
是正确的,但您还需要一个步骤:

costPtr*** matrix = new costPtr**[workers];
for (int i = 0; i < workers; i++) {
    matrix[i] = new costPtr*[jobs];
    for (int j = 0; j < jobs; j++) {
        matrix[i][j] = new costPtr;
    }
}
costPtr***矩阵=新costPtr**[工人];
for(int i=0;i
错误的具体原因如下:

(matrix[i][j])->fillCost(cost);
你已经声明了指针,但是你给了指针指向的对象一个命令——它不存在。你从来没有构造过它


更深层次的问题是,在使用指针进行尝试之前,您先使用指针数组进行尝试。在编写代码时,您应该从一些小而简单的、工作完美的东西开始,然后一次增加一点复杂性,在每一步进行测试。(由于某些原因,编程课程中从未出现过此规则。)错误的具体原因如下:

(matrix[i][j])->fillCost(cost);
你已经声明了指针,但是你给了指针指向的对象一个命令——它不存在。你从来没有构造过它


更深层次的问题是,在使用指针进行尝试之前,您先使用指针数组进行尝试。在编写代码时,您应该从一些小而简单的、工作完美的东西开始,然后一次增加一点复杂性,在每一步进行测试。(由于某些原因,编程课程中从未出现过此规则。)

查看矩阵容器的动态分配。要实现您的目标,容器类型中的每个“星”都必须有一个“新”

您成功地处理了前两个指针,如下所示:

costPtr*** matrix = new costPtr**[workers];

for (int i = 0; i < workers; i++)
    matrix[i] = new costPtr*[jobs];
costPtr***矩阵=新costPtr**[工人];
for(int i=0;i
现在,您只需处理第三个指针:

for (int i =0; i < workers; i++)
    for (int j = 0; j < jobs; j++)
    matrix [i][j] = new costPtr;
for(int i=0;i

如果没有最后一个指针分配,所有元素都将指向一个
null

查看矩阵容器的动态分配。为了达到您的目标,容器类型中的每个“星”都必须有一个“新”

您成功地处理了前两个指针,如下所示:

costPtr*** matrix = new costPtr**[workers];

for (int i = 0; i < workers; i++)
    matrix[i] = new costPtr*[jobs];
costPtr***矩阵=新costPtr**[工人];
for(int i=0;i
现在,您只需处理第三个指针:

for (int i =0; i < workers; i++)
    for (int j = 0; j < jobs; j++)
    matrix [i][j] = new costPtr;
for(int i=0;i

如果没有最后一个指针分配,所有元素都将指向一个
null

请不要成为一个。使用容器、抽象和引用使生活变得简单。如果没有看到填充矩阵的代码,任何人都无法找到错误。从您发布的内容来看,将
costPtr***
视为第一个参数对我来说似乎不正确。我学习C++十多年了,指针仍然给我带来麻烦,这就是为什么我不使用它们,除非我需要;但是,事实上你并不需要它们,它们通常是动态大小的。array@NathanOliver有人说,指针抽象的更高层次直接影响一个人的健康请勿使用容器、抽象和引用来简化生活。没有看到填充矩阵的代码,就没有人能找到错误。从你所发表的,看到 CordpTr**>代码>作为第一个参数的类型,我似乎不正确。我正在学习C++的M。十多年过去了,指针仍然给我带来麻烦,这就是为什么我不使用它们,除非我需要;)的原因