当我尝试写入二维数组时出现未处理的异常

Unhandled exception when i try to write to 2d array

因此,出于某种原因,每当我运行此程序时,我都会收到 'unhandled exception, would you like to break the code?',就像它认为我要离开数组一样。这是完整的代码,下面是 post 它中断的地方:

Header file:

struct mult_div_values
{
int mult;
float div;
};

void create_table(mult_div_values ** table, int rows, int columns)
{
table = new mult_div_values * [rows];
for (int i = 0; i < columns; i++)
{
    table[i] = new mult_div_values [columns];
}
}

void set_mult_values(mult_div_values ** table, int rows, int columns)
{
mult_div_values TableValues;
TableValues.div = 0;
for (int i = 0; i < rows; i++)
{
    TableValues.mult = i+1;
    table[0][i] = TableValues;
}

for (int i = 1; i < rows; i++)
    for (int x = 0; x < columns; x++)
    {
        if (x == 0)
        {
            TableValues.mult = i + 1;
            table[i][x] = TableValues;
        }
        else
        {
            TableValues.mult = (i+1) * (x + 1);
            table[i][x] = TableValues;
        }
    }
};

void set_div_values(mult_div_values ** table, int rows, int columns)
{
mult_div_values TableValues;
for (float i = 0; i < rows; i++)
{
    TableValues.div = i+1;
    table[0][static_cast<int>(i)] = TableValues;
}

for (float i = 1; i < rows; i++)
    for (float x = 0; x < columns; x++)
    {
        if (x == 0)
        {
            TableValues.div = i + 1;
            table[static_cast<int>(i)][static_cast<int>(x)] = TableValues;
        }
        else
        {
            TableValues.div = (i+1) / (x + 1);
            table[static_cast<int>(i)][static_cast<int>(x)] = TableValues;
        }
    }
};

源文件:

#include <iostream>
#include "mult_div.h"

using namespace::std;

struct mult_div_values;

int main()
{
mult_div_values ** table = 0;
int rows, columns, rowswanted, columnswanted;
cout << "How many rows?\n";
cin >> rows;
cout << "How many columns?\n";
cin >> columns;
cout << "Which row do you want?\n";
cin >> rowswanted;
cout << "Which column?\n";
cin >> columnswanted;

create_table(table, rows, columns);
set_mult_values(table, rows, columns);
set_mult_values(table, rows, columns);

cout << "Mult value: " << table[rowswanted][columnswanted].mult << endl << "Div value: " << table[rowswanted][columnswanted].div;

system("Pause");
}

它在以下位置中断:

void set_mult_values(mult_div_values ** table, int rows, int columns)
{
mult_div_values TableValues;
TableValues.div = 0;
for (int i = 0; i < rows; i++)
{
    TableValues.mult = i+1;
    table[0][i] = TableValues; }

我一点击最后一行,它就给我一条错误消息。有什么想法吗?

您在创建数组的函数中迭代不正确:

void create_table(mult_div_values ** table, int rows, int columns)
{
    table = new mult_div_values * [rows];
    for (int i = 0; i < columns; i++)
    //                  ^^^^^^^
    {
        table[i] = new mult_div_values [columns];
    }
}

循环应该结束 rows,而不是 columns

此外,在集合中:

void set_mult_values(mult_div_values ** table, int rows, int columns)
{
    mult_div_values TableValues;
    TableValues.div = 0;

    for (int i = 0; i < rows; i++)
    {
        TableValues.mult = i+1;
        table[0][i] = TableValues;
        //      ^^^
    }

    ..
}

那里的 i 对应于一个列索引,但您要迭代到 rows。所以要么应该是 table[i][0] = TableValues 要么循环应该遍历 columns

问题可能不止于此,但眼前的问题是在您的 create_table() 方法中,您是按值传递数组指针。结果,客户端传递给 create_table() 的指向二维数组的指针保持为 NULL,并在调用 set_mult_values() 时导致崩溃。

如果我可以简短地编辑一下,我强烈建议在提问之前使用调试器单步调试此类代码。这样做,您会看到明显的 NULL 指针被传递给 set_mult_values()。

其次,考虑使用 STL 类型而不是原始数组来处理这种事情。它将使您的生活轻松大约九百倍。