C 计算矩阵转置时的访问冲突写入位置错误
我编写了一个代码,它使用双指针计算矩阵NxM的转置。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
只要矩阵是正方形(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);