C 如何正确使用带数组的函数
这是我写的一个小程序,用来添加2个方阵 当我输入第二个矩阵时,第一个矩阵的值被改变,结果随后为假。它对2x2矩阵非常有效,但对任何更大的矩阵都无效。 该算法在不使用函数的情况下运行良好。 请帮我解决这个问题 代码如下:C 如何正确使用带数组的函数,c,matrix,C,Matrix,这是我写的一个小程序,用来添加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++) {
#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;
}
#包括
#包括
int n;
无效打印矩阵(int P[n][n])
{
int i,j;
对于(i=0;i,您可以使用结构定义自己的矩阵类型,例如:
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]的可变长度数组,它应该可以正常工作。如果你在gdb下运行这个程序,你会发现
(gdb)p A
$14=0x7FFFFFDFB0
(gdb)p B
$15=0x7FFFFFDFA0
无论选择什么“n”,数组基址总是相差16,即整数2 x 2矩阵工作
但是如果我输入长度为3,程序就会崩溃,内存崩溃。
输入前
(gdb)x/12 A
0x7FFFFFDFB0:0 0-255260739 52
0x7FFFFFFFC0:-1-1-1-1
0x7FFFFFD0:-8272 32767-1-1
输入后:
x/12 0x7FFFFFFFB0
0x7FFFFFDFB0:1 2 3 4
0x7FFFFFFFC0:5 6 7 8
0x7FFFFFD0:932767-1-1
正如我给出的值1 2 3 4 5 6 7 8 9一样
但是
通讯社
$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];
您的问题已经解决,您可以继续了C需要在编译时知道矩阵的宽度,它不能是变量。@Barmar除了它不需要在编译时知道宽度之外,它可以是变量。VLA,欢迎来到1999年:)当然,也有很多情况下VLA不合适。@Lundin好的,但他需要在阅读n
后声明矩阵变量,不是吗?@Barmar是的,数组声明必须在维度变量的右侧,请参见下面的答案。我知道VLA,但我认为它只适用于第一个维度打开。int矩阵[宽度][高度]
-宽度
和高度
是否应为常数?现代C标准允许可变长度数组使用参数?@ikh它们不必为常数,现代C具有可变长度数组的概念。C99接受可变长度数组作为函数参数,只要长度参数在数组之前GNU C有一个允许参数转发的语法扩展,比如:void func(size\t-width;size\t-height;int-matrix[width][height],size\t-width,size\t-height){…}
;在这种情况下,宽度
和高度
是形式参数,应该在矩阵
之后传递,并且只是预先声明。它仍然不起作用。问题仍然是一样的。当我读取第二个矩阵的值时,第一个矩阵的值被更改。我不知道为什么会这样@Gladson啊,原来这只是一个小错误。请看我的最新答案。谢谢你的帮助。至少这是一个很好的错误解释。我得承认我不太懂。我还是一个初学者。:)