【问题标题】:Array access violation exception in for loop at index 0索引 0 处的 for 循环中的数组访问冲突异常
【发布时间】:2016-03-26 06:34:27
【问题描述】:

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

  • 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的行列有问题?

【问题讨论】:

  • unsigned int i i &gt;= 0 这个条件什么时候变成假的?

标签: c matrix access-violation


【解决方案1】:

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

如果你在 unsigned i 的值是 0 时减少它,由于 unsigned 下溢,它变成 UINT_MAX 并且循环继续。尝试访问此类索引会引发异常,因为它不仅超出了数组范围,而且超出了程序内存空间。

就我个人而言,我会使用签名的int 来代替循环迭代器。

【讨论】:

    【解决方案2】:
        for (unsigned int j = m - 2; j >= 0; j--)
            M[i][j] = (M[i + 1][j] + M[i][j + 1]) % 10;         
    

    这永远不会结束,因为unsigned int 总是&gt;= 0

    【讨论】:

    • 就是这么简单!完全从我身边过去了。谢谢!
    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    相关资源
    最近更新 更多