我是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);
}
我希望输出是方矩阵中两个对角线之和的绝对差。
答案 0 :(得分:2)
在C ++ std::vector
(以及几乎所有其他内容)中,索引为0。因此,如果向量包含n
个元素,则有效索引从0
到n-1
。在您的行中
sumB += arr[n-i][n-i];
在第一次迭代中,i
为0。因此,您正在访问arr[n][n]
,两个索引都超出范围,因此出现了分段错误。
其他一些建议:
“分段错误”不是编译器错误(除非您非常不幸或非常努力),而是运行时错误。
基本上,“分段错误”表示您正在尝试访问或更改某些不应使用的存储位置。可能最常见的原因是因为您有一个集合(向量,数组或类似对象)并且使用了超出范围的索引(这正是您的问题)。
C ++通常采取这样的态度,即正确编码的事物应尽可能快地运行。因此,不会执行矢量索引检查之类的操作(因为如果代码正确,它们会稍微降低速度)。这就是为什么丑陋且通常难以调试的“分段错误”相对普遍的原因。