C:尺寸大于 1000 的二维数组相乘会导致分段错误
C: Multiplication of 2D arrays of sizes greater than 1000 results in a segmentation fault
我正在乘以二维数组并在初始化数组时使用动态分配(但我不知道实现是否正确)。我正在使用 CodeBlock16.0 编译我的代码。该程序 运行 适用于小于 200 的矩阵,但我希望此代码 运行 适用于大于 1000 的矩阵。
这是代码:
#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;
}
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
循环显然是要计数到 r1
,而不是 c2
。你也不需要用 C 语言进行转换。
显然并非所有数组的大小都相同。根据大小释放数组,如下所示:
//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);
我正在乘以二维数组并在初始化数组时使用动态分配(但我不知道实现是否正确)。我正在使用 CodeBlock16.0 编译我的代码。该程序 运行 适用于小于 200 的矩阵,但我希望此代码 运行 适用于大于 1000 的矩阵。
这是代码:
#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;
}
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
循环显然是要计数到 r1
,而不是 c2
。你也不需要用 C 语言进行转换。
显然并非所有数组的大小都相同。根据大小释放数组,如下所示:
//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);