c - 计算矩阵转置时出现访问冲突写入位置错误
问题描述
我编写了一个代码,它使用双指针计算矩阵 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)
解决方案
int **T = alloc(r, c);
我将从查看上面显示的代码行开始。如果要转置RxC
矩阵,您可能希望目标为CxR
. 否则,您可能会跑出其中一个维度的末尾。
除此之外,您可能还想学习使用调试器,这在 Visual Studio中特别好。单步执行代码并密切关注相关变量是一项宝贵的学习技能。
顺便说一句,还有另外两件事可能会导致您的代码出现问题:
- 在 C 中,您不应该从内存分配函数中转换返回值,这会引入某些细微的错误;和
- 您应该检查内存分配函数的返回值以确保它们没有失败。
在这种情况下,这些都不太可能,除非你的矩阵很大,但这是一个好习惯。
推荐阅读
- php - 使用 Laravel 的选项卡设置类别
- azure-functions - Azure api管理版本路由重复功能
- python - 过滤值在 Django 中显示奇怪
- javascript - 打开 Chrome devtools 如何改变行为?
- python - 使用 pynput 监听特定键
- c - 我想在用户输入值时获得数组的倒数
- robotframework - 如何修复机器人框架中的“在不推荐使用行继续标记'...'之前使用'\'转义空单元格”错误?
- vim - 在 nixos 中,如何为 nix 语言获得 vim 语法高亮?
- scala - SBT 找不到和导入cats-core
- swift - 如何在 Swift 中执行 curl 请求?