2D结构指针数组。内存访问问题

时间:2018-04-13 18:51:12

标签: c++

我正在尝试编写一个程序来计算一组Jobs:Workers的匈牙利方法。 我知道我将如何编写程序的大部分代码,但我仍然坚持加载我的矩阵。 我创建了一个用于存储信息的类,并且我已经创建了一个指向该类对象的二维数组。矩阵的每个条目都应包含分配给该Worker的成本值:Job组合。

每次我尝试将成本加载到数组中的对象时,我都会遇到内存访问冲突,我无法弄清楚原因。任何帮助将不胜感激。 谢谢, 克里斯

using namespace std;



class costPtr{
    int cost;
    int fillRow;
    int fillColumn;

public:
    costPtr()
    {
        int fillRow = 0;
        int fillColumn = 0;
        cost = 0;
    }

    void fillCost(int costInput)
    {
        cost = costInput;
    }

    int printCost() const
    {
        return cost;
    }
};


void fillMatrix(costPtr*** matrix, int workers, int jobs);

void methodMain();

void printMatrix(costPtr*** matrix, int workers, int jobs);



int main()
{
    methodMain();
}

void methodMain()
{
    int jobs, workers;
    cout << "How many jobs are there:   ";
    cin >> jobs;
    cout << "How many workers are there:   ";
    cin >> workers;

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

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

    fillMatrix(matrix, workers, jobs);

    printMatrix(matrix, workers, jobs);
}

void fillMatrix(costPtr*** matrix, int workers, int jobs)
{
    int cost;

    for (int i = 0; i < workers; i++)
    {
        for (int j = 0; j < jobs; j++)
        {
            cout << "What is the cost for worker " << i + 1 << " doing job " << j + 1 << ":   ";
            cin >> cost;
            (matrix[i][j])->fillCost(cost);
            cout << endl;
        }
    }
}

void printMatrix(costPtr*** matrix, int workers, int jobs)
{
    cout << endl << endl;
    for (int i = 0; i < workers; i++)
    {
        for (int j = 0; j < jobs; j++)
            cout << (matrix[i][j])->printCost() << " ";
        cout << endl;
    }
}

3 个答案:

答案 0 :(得分:2)

如果您希望它是“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];

当然,总有像std::vector这样的标准容器。你可以有一个矢量矢量:

// Create and initialize a workers x jobs matrix
std::vector<std::vector<costPtr>> matrix(workers, vector<costPtr>(jobs));
matrix[2][3].printCost(); // Example usage

没有明确的内存分配或指针。

编辑:重新阅读后,我发现你想要一个“2d指针数组”,所以costPtr*** matrix是正确的,但你还需要一步:

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;
    }
}

答案 1 :(得分:2)

错误的具体原因如下:

(matrix[i][j])->fillCost(cost);

您已经声明了指针,但是然后您向指针所指向的对象发出命令 - 该命令不存在。你从来没有构建它。

更深层次的问题是,在使用指针尝试之前,您尝试使用指针数组。当你编写代码时,你应该从一些小而简单的东西开始,然后一点一点地增加复杂性,每一步都要进行测试。 (出于某种原因,这条规则永远不会出现在编程课程中。)

答案 2 :(得分:0)

看一下矩阵容器的动态分配。为了达到你的目标,每个明星&#34;在容器类型中必须有一个&#34; new&#34;。

你成功处理了前两个指针,如下:

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

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

现在你需要做的就是处理第三个指针:

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

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