如何正确使用数组函数

时间:2014-07-03 09:47:51

标签: 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++)
    {
        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;
}

2 个答案:

答案 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];

你的问题已经解决,你很高兴