给数组元素赋值后程序崩溃

时间:2019-02-19 12:42:53

标签: c++ arrays qt

我有一个名称为setaddress的类,其中包含一个包含2D数组的结构:int WaterMeterIDs[20][2];

namespace Ui {
class SetAddress;
}

class SetAddress : public QDialog
{
    Q_OBJECT

public:
    struct AddressList{
        int WaterMeterIDs[20][2];
    };
    explicit SetAddress(QWidget *parent = 0);
    ~SetAddress();
    etc...
private:
    Ui::SetAddress *ui;
    AddressList m_address;

我想使用此命令将数据保存在qtablewidget单元中 在我的.cpp文件中:

void SetAddress::on_pushButton_apply_clicked()
{
    int rowscount = ui->tableWidget->rowCount();
//rowscount is always less than 20
    for(int j = 0; j < 2; j++){
        for(int i = 0; i < rowscount; i++){
            if(ui->tableWidget->item(i,j) != 0x0 ){//if cell is not empty
                 m_address.WaterMeterIDs[i][j] = ui->tableWidget->item(i,j)->text().toInt();//convert data to int and put it in array
                 qDebug()<<m_address.WaterMeterIDs[i][j];
            }
        }
    }
}

当我单击Apply按钮时,程序运行良好(我可以使用qDebug()看到数组元素)。 但是,如果我按了应用按钮之后再按任何其他键,即使关闭按钮(或者即使我想调整窗口大小),程序也会崩溃!

1 个答案:

答案 0 :(得分:3)

  

您能在我的代码中看到任何错误吗?

即使您确定索引在范围内,显示给我们的代码中也没有任何东西可以确保确实如此,所以我将用以下代码替换您的数组:

#include <array>

class AddressList{
    std::array<std::array<int, 2>, 20> WaterMeterIDs;

public:
    inline constexpr int& at(size_t row, size_t col) {
        return WaterMeterIDs.at(row).at(col);
    }

    inline constexpr int const& at(size_t row, size_t col) const {
        return WaterMeterIDs.at(row).at(col);
    }
};

然后通过at()函数访问数组:

// set value
m_address.at(i,j) = ...

// log value
qDebug() << m_address.at(i,j);

这应该确保您没有涉及2D阵列的缝隙。

我会在循环之前检查ui->tableWidget->columnCount() >= 2,只是为了排除这种情况:

int colcount = std::min(2, ui->tableWidget->columnCount());
for(int j = 0; j < colcount; ++j) {
   ...