索引 0 处的 for 循环中的数组访问冲突异常
Array access violation exception in for loop at index 0
我正在编写一个需要构建以下矩阵的程序:
- n,m分别为行数和列数
- 最后一列的所有元素都必须等于 1
- 最后一行的所有元素都必须等于 1
- 所有其他元素必须是其下方元素与其右侧元素之和的最后一位
这是我的函数。
void buildMatrix()
{
// Last row is 1.
for (unsigned int j = 0; j < m; j++)
M[n - 1][j] = 1;
// Last column is 1
for (unsigned int i = 0; i < n; i++)
M[i][m - 1] = 1;
// Other elements are calculated
for (unsigned int i = n - 2; i >= 0; i--)
for (unsigned int j = m - 2; j >= 0; j--)
M[i][j] = (M[i + 1][j] + M[i][j + 1]) % 10;
}
然而,在最后一行 (M[i][j] = (M[i + 1][j] + M[i][j + 1]) % 10;
) 它抛出一个访问冲突异常。看在我的份上,我想不通为什么。
例如,对于 n = 4 和 m = 5,我的函数应该是
5 0 0 4 1
5 0 6 3 1
5 4 3 2 1
1 1 1 1 1
问题似乎是在i或j为零时出现的。如果我在最后一个 fors 中将“>=”替换为“>”,它会给出以下内容:
0 0 0 0 1
0 0 6 3 1
0 4 3 2 1
1 1 1 1 1
为什么 0 的行和列有问题?
for (unsigned int j = m - 2; j >= 0; j--)
M[i][j] = (M[i + 1][j] + M[i][j + 1]) % 10;
这永远不会结束,因为 unsigned int
总是 >= 0
无符号值不能为负,因此条件 i >= 0
始终为真。
如果你在 unsigned i
的值是 0
时递减它,它会由于 unsigned 下溢而变成 UINT_MAX
并且循环继续。尝试访问此类索引会引发异常,因为它不仅超出了数组范围,而且超出了程序内存 space.
就我个人而言,我会使用带符号的 int
作为循环迭代器。
我正在编写一个需要构建以下矩阵的程序:
- n,m分别为行数和列数
- 最后一列的所有元素都必须等于 1
- 最后一行的所有元素都必须等于 1
- 所有其他元素必须是其下方元素与其右侧元素之和的最后一位
这是我的函数。
void buildMatrix()
{
// Last row is 1.
for (unsigned int j = 0; j < m; j++)
M[n - 1][j] = 1;
// Last column is 1
for (unsigned int i = 0; i < n; i++)
M[i][m - 1] = 1;
// Other elements are calculated
for (unsigned int i = n - 2; i >= 0; i--)
for (unsigned int j = m - 2; j >= 0; j--)
M[i][j] = (M[i + 1][j] + M[i][j + 1]) % 10;
}
然而,在最后一行 (M[i][j] = (M[i + 1][j] + M[i][j + 1]) % 10;
) 它抛出一个访问冲突异常。看在我的份上,我想不通为什么。
例如,对于 n = 4 和 m = 5,我的函数应该是
5 0 0 4 1
5 0 6 3 1
5 4 3 2 1
1 1 1 1 1
问题似乎是在i或j为零时出现的。如果我在最后一个 fors 中将“>=”替换为“>”,它会给出以下内容:
0 0 0 0 1
0 0 6 3 1
0 4 3 2 1
1 1 1 1 1
为什么 0 的行和列有问题?
for (unsigned int j = m - 2; j >= 0; j--)
M[i][j] = (M[i + 1][j] + M[i][j + 1]) % 10;
这永远不会结束,因为 unsigned int
总是 >= 0
无符号值不能为负,因此条件 i >= 0
始终为真。
如果你在 unsigned i
的值是 0
时递减它,它会由于 unsigned 下溢而变成 UINT_MAX
并且循环继续。尝试访问此类索引会引发异常,因为它不仅超出了数组范围,而且超出了程序内存 space.
就我个人而言,我会使用带符号的 int
作为循环迭代器。