这是我编写的一个小程序,用于添加2个方形矩阵。
当我输入第二个矩阵时,第一个的值被改变,结果随后为假。它适用于2x2矩阵,但不适用于任何更大的矩阵。 该算法在不使用函数的情况下运行良好。 请帮我解决这个问题。
以下是代码:
#include <stdio.h>
#include <stdlib.h>
int n;
void PrintMatrix(int P[n][n])
{
int i,j;
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<n;j++)
{
printf("%d\t", P[i][j]);
}
}printf("\n");
}
void ReadMatrix(int P[n][n])
{
int i,j;
for(i=0;i<n;i++)
{
printf("input row %d\n", i+1);
for(j=0;j<n;j++)
{
scanf("%d", &P[i][j]);
}
}
}
void AddMatrix(int P[n][n], int Q[n][n], int Result[n][n])
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
Result[i][j]=P[i][j]+Q[i][j];
}
}
}
int main()
{
int i,j;
int A[n][n];
int B[n][n];
int Sum[n][n];
printf("input matrix size:");
scanf("%d", &n);
printf("input first matrix\n");
ReadMatrix(A);
PrintMatrix(A);
printf("input second matrix\n");
ReadMatrix(B);
PrintMatrix(B);
AddMatrix(A,B,Sum);
PrintMatrix(Sum);
return 0;
}
答案 0 :(得分:1)
您可以使用结构定义自己的矩阵类型,例如:
typedef struct
{
int* data;
size_t width;
size_t height
} matrix_t;
或者如果你有一个现代的C编译器,你可以编写像
这样的函数void func (size_t width, size_t height, int matrix[width][height])
但结构版本可能更适合。
修改强>
至于你的程序错误的原因,你必须将n
初始化为一个值。如果在之后将数组声明为大小为[n] [n] 的可变长度数组,则从用户那里读取n
,它应该可以正常工作。
答案 1 :(得分:0)
如果你在gdb下运行这个,你会发现 (gdb)p A. $ 14 = 0x7fffffffdfb0 (gdb)p B $ 15 = 0x7fffffffdfa0
无论你选择什么“n”,数组基址总是相差16,即整数2 x 2矩阵工作
但如果i输入长度为3则程序崩溃。存在内存损坏。 在做输入之前 (gdb)x / 12 A. 0x7fffffffdfb0:0 0 -255260739 52 0x7fffffffdfc0:-1 -1 -1 -1 0x7fffffffdfd0:-8272 32767 -1 -1
输入后: x / 12 0x7fffffffdfb0 0x7fffffffdfb0:1 2 3 4 0x7fffffffdfc0:5 6 7 8 0x7fffffffdfd0:9 32767 -1 -1 很好,因为我给了价值1 2 3 4 5 6 7 8 9
但 p $ 16 = 0x7fff00000009 这是访问它导致PrintMatrix中的分段错误。
现在,如果您将程序更改为此
int main()
{
int i,j;
printf("input matrix size:");
scanf("%d", &n);
int A[n][n];
int B[n][n];
int Sum[n][n];
你的问题已经解决,你很高兴