计算矩阵转置时访问冲突写入位置错误

Access violation writting location error when calculating the transpose of a matrix

我编写了一个代码,使用双指针计算矩阵 NxM 的转置。
只要矩阵是正方形 (NxN),它就可以正常工作,但如果不是,我会收到此错误:

Exception thrown at 0x00052580 in ConsoleApplication27.exe: 0xC0000005: Access violation writing location 0xFDFDFDFD. If there is a handler for this exception, the program may be safely continued.

这是我的代码:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

int **alloc(int r, int c) {
    int **d;

    d = (int **)malloc(r * sizeof(int *));
    for (int i = 0; i < r; i++) {
        d[i] = (int *)malloc(c * sizeof(int));
    }
    return d;
}

void input(int **A, int r, int c) {
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            printf("[%d][%d]=", i, j);
            scanf("%d", &A[i][j]);
        }
    }
}

void output(int **A, int r, int c) {
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            printf("%d ", A[i][j]);
        }
        printf("\n");
    }
}
void transpose(int **A, int r, int c) {
    int **T = alloc(r, c);
    int i, j;
    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
            T[j][i] = A[i][j];
    output(T, c, r);
}

void main()
{
  int r,c;
  scanf("%d%d",&r,&c);
  int **A=alloc(r,c);
  input(A, r, c);
  printf("The transpose of the matrix is: \n");
            transpose(A, r, c);
}

你能指出并修复我的错误吗?我在 Visual Studio 2015 年遇到了 运行 这个错误,在 https://www.onlinegdb.com 我得到了 分段错误(核心转储)

int **T = alloc(r, c);

我会开始 查看上面显示的代码行。如果您要转置 RxC 矩阵,您可能希望目标为 CxR。否则,您可能 运行 偏离其中一个维度的末尾。

除此之外,您可能想学习使用调试器,特别是 Visual Studio。单步执行代码并密切关注相关变量是一项值得学习的宝贵技能。


顺便说一句,还有两件事可能会导致您的代码出现问题:

  • 在 C 中,您不应该从内存分配函数中强制转换 return 值,这会引入某些细微的错误;和
  • 您应该检查 return 内存分配函数的值以确保它们没有失败。

在这种情况下,这两种情况都不太可能,除非您的矩阵很大,但这是一个养成的好习惯。