为什么即使我只是检查"Out Of Bound"值而不访问它,也会发生分段错误


bool isValid(int x, int y, vector<vector<int>> &arr)
{
if (x >= 0 && x <= arr.size() && y >= 0 && y <= arr[0].size() && arr[x][y] == 1)
return true;
return false;
}
  1. 我在这个(x<=arr.size((和y<arr[0].size(((
  2. 你们能解释一下为什么我会得到这个吗?即使我没有访问越界值,我只是在比较它

将太多条件组合在一个条件中并不总是好的。将它分为几个条件有助于调试。简单的代码并不总是更少的代码。

bool isValid(int x, int y, vector<vector<int>> &arr) {
// first index is ok?
if (x < 0) return false; 
if (x >= arr.size()) return false;
// only now you can access arr[x]
if (y < 0) return false;
if (y >= arr[x].size()) return false;
// both are ok
return arr[x][y] == 1;
}

在代码中,您检查的是arr[0]而不是arr[x],当所有内部向量大小相同时,您可以考虑使用不同的数据结构。即使知道所有内部向量大小相同,也应该检查arr[x]而不是arr[0]。还要考虑对索引使用size_t(它是unsigned(,然后可以删除对<0的检查。

您的代码可以segfault,因为最后一个有效索引是size -1而不是size,并且arr[0]不一定具有与arr[x]相同数量的元素。

如果x == 0arr.size() == 0呢?

在这种情况下,您将无法访问y <= arr[0].size()表达式中的arr[0],因为您正试图访问arr[0]中存在的向量对象,而这些对象并不存在。

更一般地说,您必须注意,如果x == arr.size()y == arr[x].size(),则访问arr[x][y]是无效的,但在您的条件下,x <= arr.size()y <= arr[0].size()允许出现这种情况。你的功能最终会像这样:

bool isValid(int x, int y, vector<vector<int>> &arr)
{
if (x >= 0 && x < arr.size() && y >= 0 && y < arr[x].size() && arr[x][y] == 1)
return true;
return false;
}

为什么我得到这个,即使我没有访问越界值,我只是在比较它[?]

考虑y <= arr[0].size(),在这里您不仅仅是在比较,而是访问arr的第一个元素并检索其大小。问题是arr可能是空的,因此arr[0]将是越界访问。

此外,由于size() - 1是最后一个有效索引,因此使用<=是一个错误。

该函数可以像下面的一样重写

bool isValid(int x, int y, std::vector<std::vector<int>> const& m)
{
return x >= 0  and  x < m.size()  and
//                    ^
y >= 0  and  y < m[x].size()  and
//                    ^  ^^^              Are all the same size?
m[x][y] == 1;
}

相关内容

  • 没有找到相关文章

最新更新