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

时间:2015-01-07 23:28:27

标签: c++ arrays visual-studio-2012 unhandled-exception

因此,由于某些原因,我一直处理未处理的异常,您是否想要破解代码?'每当我运行它时,就像它认为我要走出阵列一样。这是整个代码,并且在下面打破了它的位置:

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

一旦我点击最后一行,它就会给我一个错误信息。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

您在创建数组的函数中迭代错误:

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

答案 1 :(得分:1)

可能存在的问题多于此问题,但直接的问题是在create_table()方法中,您按值传递数组指针。因此,指向客户端传递给create_table()的2d数组的指针仍为NULL,并在调用set_mult_values()时导致崩溃。

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

其次,考虑使用STL类型而不是原始数组来做这种事情。它会让你的生活变得容易大约九百倍。