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

C 计算矩阵转置时的访问冲突写入位置错误,c,pointers,matrix,error-handling,segmentation-fault,C,Pointers,Matrix,Error Handling,Segmentation Fault,我编写了一个代码,它使用双指针计算矩阵NxM的转置。 只要矩阵是正方形(NxN),它就可以正常工作,但如果不是,我会得到以下错误: ConsoleApplication27.exe中0x00052580处引发异常:0xC0000005:访问冲突写入位置0xFDFD。如果存在此异常的处理程序,则程序可以安全地继续 这是我的密码: #include <stdlib.h> #include <stdio.h> #include <conio.h> int **al

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

ConsoleApplication27.exe中0x00052580处引发异常:0xC0000005:访问冲突写入位置0xFDFD。如果存在此异常的处理程序,则程序可以安全地继续

这是我的密码:

#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);
}
#包括
#包括
#包括
内部**所有(内部r,内部c){
int**d;
d=(int**)malloc(r*sizeof(int*);
对于(int i=0;i
你能帮我指出并纠正我的错误吗?我在VisualStudio2015中运行了这个程序,我得到了那个错误,在上一次我得到了分段错误(核心转储)

我首先看一下上面显示的代码行。如果要转置
RxC
矩阵,可能希望目标是
CxR
。否则,您可能会跑出其中一个维度的末尾

除此之外,您可能还想学习使用调试器,这在VisualStudio中尤其好。单步执行代码并关注相关变量是一项值得学习的宝贵技能


另外,还有两件事可能会导致代码出现问题:

  • 在C语言中,您不应该强制转换内存分配函数的返回值,这可能会引入某些微妙的错误;及
  • 您应该检查内存分配函数的返回值,以确保它们没有失败

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

0xfdfd是调试堆在分配周围使用的一个前哨值。您正在访问某个超出范围的内存。在调试器中运行代码,以便您可以看到它在哪里崩溃,并从那里向后工作。
int **T = alloc(r, c);