如何解决:“ Segmentation Fault”编译器消息?

时间:2019-03-27 23:33:51

标签: c++

我是c ++的新手,我正试图解决黑客方面的c ++实践问题。编译后,尝试获取方矩阵中两个对角线之和之间的绝对差时,得到了编译器消息“ Segmentation Fault”。

我已将问题缩小到第8行,但我不知道如何解决。

int diagonalDifference(vector<vector<int>> arr) {
    int sumA,sumB;
    int n = arr.size();
    for (int i=0;i<n;++i) {
        sumA += arr[i][i];
        sumB += arr[n-i][n-i];
    }
    return abs(sumA - sumB);
}

我希望输出是方矩阵中两个对角线之和的绝对差。

1 个答案:

答案 0 :(得分:2)

在C ++ std::vector(以及几乎所有其他内容)中,索引为0。因此,如果向量包含n个元素,则有效索引从0n-1。在您的行中

sumB += arr[n-i][n-i];

在第一次迭代中,i为0。因此,您正在访问arr[n][n],两个索引都超出范围,因此出现了分段错误。


其他一些建议:

  • “分段错误”不是编译器错误(除非您非常不幸或非常努力),而是运行时错误。

  • 基本上,“分段错误”表示您正在尝试访问或更改某些不应使用的存储位置。可能最常见的原因是因为您有一个集合(向量,数组或类似对象)并且使用了超出范围的索引(这正是您的问题)。

  • C ++通常采取这样的态度,即正确编码的事物应尽可能快地运行。因此,不会执行矢量索引检查之类的操作(因为如果代码正确,它们会稍微降低速度)。这就是为什么丑陋且通常难以调试的“分段错误”相对普遍的原因。