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

标签 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 达到零时。如果我在最后一个 fors 中用“>”替换“>=”,它会给我以下内容:

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

为什么0的行和列有问题?

最佳答案

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

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

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

关于c - 索引 0 处的 for 循环中的数组访问冲突异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34374443/

相关文章:

c++ - 从 Delphi 应用程序调用外部函数 (C++) 时发生访问冲突

c - 初始化使指针来自整数,无需进行强制转换以及指针与整数之间的比较

linux - 如果有2个矩阵a和b,a(b)在matlab中做什么?

c - 函数中 C 中的指针怪异行为

r - 如何从数据框中创建矩阵?

matrix - 基本高斯消除求解器产生错误结果

delphi - 访问 Intraweb 中的 UserSession 时的访问冲突

C++访问冲突崩溃

c++ - C/C++ : Passing a string read to a loop inside a program in C

c - 用 C 打印存档文件的内容