簡體   English   中英

如何正確使用數組函數

[英]How to use functions with arrays correctly

這是我編寫的一個小程序,用於添加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;
}

您可以使用結構定義自己的矩陣類型,例如:

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])

但是struct版本可能更喜歡。


編輯

至於為什么程序有錯誤,必須將n初始化為一個值。 如果將數組聲明為從用戶讀取n的點之后大小為[n] [n]的可變長度數組,則該數組應該可以正常工作。

如果您在gdb下運行此命令,則會發現(gdb)p A $ 14 = 0x7fffffffdfb0(gdb)p B $ 15 = 0x7fffffffdfa0

不管您選擇什么“ n”,數組基址始終相差16,即整數2 x 2矩陣有效

但是,如果我輸入長度為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 A $ 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];

您的問題已解決,您很高興

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM