以下是将两个矩阵相乘的代码。当我尝试输入数组元素时,它会在运行时停止。我为重复执行的任务创建了不同的功能,从而使其变得模块化,易于理解和调试。
#include<stdio.h>
#include<stdlib.h>
void input(int *rows, int *columns); //Inputs rows and columns
void allocate(int **arr, int rows, int columns); //Allocates memory for the array
void initialize(int **arr, int rows, int columns); //Initializes(rather, declares because calloc initializes to zero) the array
void release(int **arr, int rows); //Frees the dynamically allocated memory
int main(void)
{
int **matrix1, **matrix2, **product, rows1, rows2, columns1, columns2, i, j;
printf("\nEnter rows and columns of first matrix\n");
input(&rows1, &columns1);
allocate(matrix1, rows1, columns1);
printf("\nEnter rows and colummns of second matrix\n");
input(&rows2, &columns2);
allocate(matrix2, rows2, columns2);
if(columns1 != rows2)
{
printf("Matrix cannot be multiplied!");
exit(0);
}
printf("\nEnter the contents of matrix 1\n");
此行是问题开始的地方
initialize(matrix1, rows1, columns1);
程序的其余部分如下:
printf("\nEnter the contents of matrix 2\n");
initialize(matrix2, rows2, columns2);
initialize(product, rows1, columns2);
for(i = 0; i < rows1; i++)
for(j = 0; j < columns2; j++)
for(int k = 0; k < columns1; k++)
product[i][j] = product[i][j] + matrix1[i][k] * matrix2[k][j];
for(i = 0; i < rows1; i++)
{
for(j = 0; j < columns2; j++)
printf("%d ", product[i][j]);
printf("\n");
}
release(matrix1, rows1);
release(matrix2, rows2);
release(product, rows1);
}
input()获取数组的行和列
void input(int *rows, int *columns)
{
printf("Rows = ");
scanf("%d", rows);
printf("Columns = ");
scanf("%d", columns);
}
allocate()函数动态地将内存分配给矩阵。首先,它为 int * 类型分配内存,然后为 int 类型分配内存。通过与NULL比较,它还会检查内存是否正确分配。
void allocate(int **arr, int rows, int columns)
{
arr = (int**)calloc(rows, sizeof(int*));
if(arr == NULL)
{
printf("Memory Allocation Failed!");
exit(1);
}
for(int i = 0; i < rows; i++)
{
arr[i] = (int*)calloc(columns, sizeof(int));
if(arr[i] == NULL)
{
printf("Memory Allocation Failed!");
exit(1);
}
}
}
initialize()函数输入数组的元素。 程序正常运行,直到达到此功能。当我输入数组元素并按Enter键时,程序终止,并出现一个对话框,显示:问题导致程序停止工作正确地。 Windows将关闭程序并通知是否有解决方案。
void initialize(int **arr, int rows, int columns)
{
for(int i = 0; i < rows; i++)
for(int j = 0; j < columns; j++)
scanf("%d", &arr[i][j]);
}
release()函数释放动态分配的内存。
void release(int **arr, int rows)
{
for(int i = 0; i < rows; i++)
free(arr[i]);
free(arr);
}
答案 0 :(得分:0)
您没有使用allocate
函数初始化这些指针,而是对未初始化的内存进行了段故障处理。
要使您的代码以最小的更改工作,可以改用三个星型指针:
void allocate(int ***arr, int rows, int columns)
{
*arr = (int**)calloc(rows, sizeof(int*));
if(*arr == NULL)
{
printf("Memory Allocation Failed!");
exit(1);
}
for(int i = 0; i < rows; i++)
{
(*arr)[i] = (int*)calloc(columns, sizeof(int));
if((*arr)[i] == NULL)
{
printf("Memory Allocation Failed!");
exit(1);
}
}
}
然后适当地更改对allocate
函数主体的每次调用
allocate(&matrix1, &rows1, columns1);
但这很难推理。一个更正确的答案是重新组织allocate
函数以返回所需的数组:
int ** allocate(int rows, int columns)
{
int **arr = calloc(rows, sizeof(int*));
if(arr == NULL)
{
printf("Memory Allocation Failed!");
exit(1);
}
for(int i = 0; i < rows; i++)
{
arr[i] = (int*)calloc(columns, sizeof(int));
if(arr[i] == NULL)
{
printf("Memory Allocation Failed!");
exit(1);
}
}
return arr;
}
现在分配呼叫如下:
matrix1 = allocate(rows1, columns1);
奖励错误:
您根本不会为allocate
数组调用products
,这也(通常)会导致段错误。