计算矩阵转置时访问冲突写入位置错误
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 内存分配函数的值以确保它们没有失败。
在这种情况下,这两种情况都不太可能,除非您的矩阵很大,但这是一个养成的好习惯。
我编写了一个代码,使用双指针计算矩阵 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 内存分配函数的值以确保它们没有失败。
在这种情况下,这两种情况都不太可能,除非您的矩阵很大,但这是一个养成的好习惯。