第二个循环中的条件m[i][j] != 0
由于某种原因在clion中产生错误EXC_BAD_ACCESS (code=1, address=0x0)
。我简化了一个例子。我想订阅向量,直到我遇到零或直到它结束。
#include <iostream>
#include <vector>
int matrixElementsSum(std::vector<std::vector<int>> m) {
for (int j = 0; j != m[0].size(); ++j) {
for (int i = 0; (m[i][j] != 0) && (i != m.size()); ++i) {
std::cout << m[i][j] << std::endl;
}
}
return 0;
}
int main() {
std::vector<std::vector<int>> matrix = { {1, 1, 1, 0} };
int s = matrixElementsSum(matrix);
std::cout << "s = " << s << std::endl;
}
答案 0 :(得分:3)
在循环中:
for (int i = 0; (m[i][j] != 0) && (i != m.size()); ++i)
在检查大小(m[i][j] != 0
)之前将执行 i != m.size()
,因此当i == m.size()
您将访问越界时,并调用未定义的行为。
要解决此类问题,您可以使用C ++短路评估,并重写这样的条件:
for (int i = 0; (i != m.size()) && (m[i][j] != 0); ++i)
如果达到了大小 - 无论如何整个条件都是false
,因此m[i][j] != 0
将不会被执行。
答案 1 :(得分:1)
我认为,第一个循环中的条件应如下所示:
j != m.size()
不是j != m[0].size()
答案 2 :(得分:1)
由于您尝试通过(m[i][j] != 0) && (i != m.size())
函数中的matrixElementSums
访问垃圾
要解决此问题,请先添加溢出条件,而不是通过(i != m.size()) && (m[i][j] != 0)
答案 3 :(得分:0)
m[0].size()
为空,则 m
具有未定义的行为。函数调用中m
可能不为空,但在分析matrixElementsSum
时,静态分析器无法知道函数调用的所有方式。
此外,它假设矢量矢量是矩形的 - 即所有行都是相同的宽度,因为你只比较第一行的大小,而不是其余的。这可能是矩阵的情况,但静态分析器不知道矩阵是什么。
最后,m[i][j] != 0
在i > m.size()
时超出范围。你需要先检查一下。这是最糟糕的问题,因为其他问题可以处理函数前置条件的文档,而任何输入都会出现此错误。
答案 4 :(得分:0)
您可以使用基于范围的for
循环来避免代码中的所有愚蠢错误:
int matrixElementsSum(const std::vector<std::vector<int>>& m) {
for (auto const& row: m) {
for (auto const& value: row) {
std::cout << value << std::endl;
}
}
return 0;
}
更容易混淆,更容易纠正!