首页 > 解决方案 > 计算矩阵转置时出现访问冲突写入位置错误

问题描述

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

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

这是我的代码:

#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我得到了Segmentation fault (core dumped)

标签: cpointersmatrixerror-handlingsegmentation-fault

解决方案


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

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

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


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

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

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


推荐阅读