[英]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.