For循环条件

时间:2017-07-17 07:31:14

标签: c++ for-loop

第二个循环中的条件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;
}

5 个答案:

答案 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] != 0i > 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;
}

更容易混淆,更容易纠正!