索引0处for循环中的数组访问冲突异常

时间:2015-12-19 19:18:41

标签: c matrix access-violation

我正在编写一个需要构建以下矩阵的程序:

  • 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达到零时,似乎会出现问题。如果我用“&gt;”替换“&gt; =”在最后一篇文章中,它给了我以下内容:

0 0 0 0 1
0 0 6 3 1
0 4 3 2 1
1 1 1 1 1

为什么0和0的行和列出现问题?

2 个答案:

答案 0 :(得分:4)

无符号值不能为负数,因此条件i >= 0始终为真。

如果在值为i时递减无符号0,则由于无符号下溢而变为UINT_MAX并且循环继续。尝试访问此索引会引发异常,因为它不仅超出数组范围,而且还超出程序存储空间。

就个人而言,我会使用带符号的int代替循环迭代器。

答案 1 :(得分:2)

    for (unsigned int j = m - 2; j >= 0; j--)
        M[i][j] = (M[i + 1][j] + M[i][j + 1]) % 10;         

这永远不会完成,因为unsigned int总是>= 0