C:大小大于1000的2D数组相乘会导致分段错误
我将二维数组相乘,并在初始化数组时使用动态分配(但我不知道实现是否正确)。我正在使用CodeBlock16.0编译代码。该程序在矩阵大小小于200时运行良好,但我希望此代码在矩阵大小大于1000时运行 代码如下:C:大小大于1000的2D数组相乘会导致分段错误,c,matrix-multiplication,dynamic-allocation,C,Matrix Multiplication,Dynamic Allocation,我将二维数组相乘,并在初始化数组时使用动态分配(但我不知道实现是否正确)。我正在使用CodeBlock16.0编译代码。该程序在矩阵大小小于200时运行良好,但我希望此代码在矩阵大小大于1000时运行 代码如下: #include <stdio.h> #include <time.h> #include <stdlib.h> int main(){ int **matriks1=NULL,**matriks2=NULL,**result=NULL,
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
int **matriks1=NULL,**matriks2=NULL,**result=NULL, r1=0, c1=0, r2=0, c2=0, i, j, k;
printf("Enter rows and column for first matrix: ");//input size for matrix 1
scanf("%d %d", &r1, &c1);
matriks1=(int **)malloc(r1*sizeof(int*));
for(int i=0;i<r1;++i) matriks1[i]=(int*)malloc(c1*sizeof(int));
result=(int**)calloc(r1,sizeof(int*));
printf("Enter rows and column for second matrix: ");//input size for matrix 2
scanf("%d %d",&r2, &c2);
matriks2=(int **)malloc(r2*sizeof(int*));
for(int i=0;i<r2;++i) matriks2[i]=(int*)malloc(c2*sizeof(int));
for(int i=0;i<c2;++i) result[i]=(int*)calloc(c2,sizeof(int));
srand(time(NULL));
// Column of first matrix should be equal to column of second matrix and
while (c1 != r2)
{
printf("Error! Kolom matriks pertama tidak sama dengan baris matriks kedua.\n\n");
printf("Enter rows and column for first matrix: ");
scanf("%d %d", &r1, &c1);
printf("Enter rows and column for second matrix: ");
scanf("%d %d",&r2, &c2);
}
// Storing elements of first matrix.
printf("\nElements of matrix 1:\n");
for(i=0; i<r1; ++i)
for(j=0; j<c1; ++j){
printf("Elements a%d%d: ",i+1, j+1);
matriks1[i][j]=rand()%10;
printf("%d ",matriks1[i][j]);
//scanf("%d", &a[i][j]);
}
// Storing elements of second matrix.
printf("\nElements of matrix 2:\n");
for(i=0; i<r2; ++i)
for(j=0; j<c2; ++j){
printf("Enter elements b%d%d: ",i+1, j+1);
matriks2[i][j]=rand()%10;
printf("%d ",matriks2[i][j]);
}
// Initializing all elements of result matrix to 0
for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j)
{
result[i][j] = 0;
}
// Multiplying matrices a and b and
// storing result in result matrix
for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j)
for(k=0; k<c1; ++k)
{
result[i][j]+=matriks1[i][k]*matriks2[k][j];
}
// Displaying the result
printf("\nOutput Matrix:\n");
for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j)
{
printf("%d ", result[i][j]);
if(j == c2-1)
printf("\n\n");
}
for(int i=0;i<r1;i++){
free(matriks1[i]);
free(matriks2[i]);
free(result[i]);
}
free(matriks1);
free(matriks2);
free(result);
return 0;
}
#包括
#包括
#包括
int main(){
int**matriks1=NULL,**matriks2=NULL,**result=NULL,r1=0,c1=0,r2=0,c2=0,i,j,k;
printf(“输入第一个矩阵的行和列:”;//输入矩阵1的大小
scanf(“%d%d”、&r1和&c1);
矩阵1=(int**)malloc(r1*sizeof(int*);
对于(int i=0;i)当您以不同的方式运行时会发生什么?您得到的错误是什么?分段错误,我仍然不明白为什么?
result = calloc(r1,sizeof(int*)); //<== `r1` count declared in array
//for(int i = 0; i<c2; ++i) //<== remove
for(int i = 0; i < r1; ++i) //<== should allocate up to `r1`
result[i] = (int*)calloc(c2, sizeof(int));
//for(int i=0;i<r1;i++){ <= remove
// free(matriks1[i]);
// free(matriks2[i]);
// free(result[i]);
//}
for(int i = 0; i < r1; i++) free(matriks1[i]);
for(int i = 0; i < r2; i++) free(matriks2[i]);
for(int i = 0; i < r1; i++) free(result[i]);
free(matriks1);
free(matriks2);
free(result);