【问题标题】:Segmentation fault - C++ array分段错误 - C++ 数组
【发布时间】:2017-02-03 01:12:59
【问题描述】:

我正在尝试使用以下连接更改某些标签的文本:

connect(ui->styleSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(setStyle(int)));
connect(this, SIGNAL(instrumentChanged(QString)), ui->label_inst_1, SLOT(setText(QString)));
connect(this, SIGNAL(instrumentChanged_2(QString)), ui->label_inst_2, SLOT(setText(QString)));
connect(this, SIGNAL(instrumentChanged_3(QString)), ui->label_inst_3, SLOT(setText(QString)));

我的setStyle 槽:

    void SamplerModule::setStyle(int style){
    m_style = style;  
    emit instrumentChanged(m_instruments[m_style][0]);
    emit instrumentChanged_2(m_instruments[m_style][1]);
    emit instrumentChanged_3(m_instruments[m_style][3]);
}

还有我的数组(在我的 Class 构造函数中设置)

QString m_instruments[3][3];

m_instruments[0][1] = "Trompette";
m_instruments[0][2] = "Basse";
m_instruments[0][3] = "Piano";

m_instruments[1][1] = "Guitare";
m_instruments[1][2] = "Batterie";
m_instruments[1][3] = "Basse";

m_instruments[2][1] = "Basse";
m_instruments[2][2] = "Batterie";
m_instruments[2][3] = "Guitare";

但是当我尝试运行代码时,由于我的信号使用m_instruments[x][0],我遇到了分段错误。

我真的不明白为什么。我的插槽setStyle 有权访问这个数组,为什么会出现这个分段错误?


详情:

如果我在标题中设置QString m_instruments[3][3]; 而不是QString m_instruments[][3];,那么段错误就会消失。 但是,数组在构造函数之外是空的。

qDebug() << m_instruments[0][0]; 在构造函数中返回“Trompette”,但在我的setStyle 插槽中返回“”!

【问题讨论】:

  • 你知道数组是0索引的,对吧?因此,大小为 3 的数组将包含索引为 0,1 和 2 的元素。访问此类数组中索引为 3 的元素是错误的。
  • 我的错,我尝试了很多次来编辑我忘记设置正确索引的所有内容。它已修复,但分段错误仍然存​​在。 ://
  • 什么值作为参数传递给 setStyle() 槽?如果它不是 0、1 或 2,那么您将访问 m_instruments 数组中的无效索引。
  • 你能像你的代码那样取悦构造函数的完整主体吗?具体来说,它实际上是否包含QString m_instruments[3][3]; 位? (实际上是隐藏成员变量)?
  • 对不起,问题还是一样。我刚刚添加了更多信息。

标签: c++ qt segmentation-fault


【解决方案1】:

在您的代码中,您列出了以下数组:

QString m_instruments[3][3];

这个数组的长度是 3x3,这意味着你可以访问 3 个列元素,0、1 和 2。在这一行:

m_instruments[0][3] = "Piano";

您访问元素 index 3,它超出了数组的末尾,这会导致 Undefined Behavior(在您的情况下会导致 seg 错误)。

这可能不是您的代码的唯一问题,但肯定是其中之一。

【讨论】:

  • 我的错,我尝试了很多次来编辑我忘记设置正确索引的所有内容。它已修复,但分段错误仍然存​​在。 ://
  • @RobinFourcade 你确定它不在其他地方吗?段错误可能会很棘手,代码会在 there 上破坏某些东西,最后在 here 处掉下来并死掉。
  • 非常肯定,是的!我一评论 3 发射,故障就消失了。并且仅当我通过选择器更改索引以及尝试访问我的数组时才会发生错误。
  • @RobinFourcade 好的,但是您实际上在两个地方使用了索引 [3]:在构造函数中设置 m_instruments 时使用它,并且在第三个地方使用它发射。这个答案只指出了前者,所以也许你错过了它,但是在确定 seg 错误仍然存​​在之前,你是否修复了 both ?或者你只是解决了一个问题?你也肯定你没有在其他代码sn-ps的其他地方使用索引[3]吗?最后,既然您在这里犯了这个索引错误,您是否确定在其他地方的其他数组中没有类似的索引错误?仔细检查!
  • @Robin 在我看来,您有大约十几个不同的问题,所有这些问题都归结为根本无法理解如何正确声明和访问数组,尤其是。多维的。查看cplusplus.com/doc/tutorial/arrays通读,必要时练习一下,然后重新检查你的代码,看看你是否可以在那里应用任何知识。例如,您手动尝试声明缺少[] 第一个索引的数组是非常 不正确的,但您更容易查找原因,然后我们提供语言基础教程。
猜你喜欢
  • 1970-01-01
  • 2021-06-27
  • 2017-04-11
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多