程序在运行时终止

时间:2019-12-28 08:48:49

标签: c arrays data-structures

以下是将两个矩阵相乘的代码。当我尝试输入数组元素时,它会在运行时停止。我为重复执行的任务创建了不同的功能,从而使其变得模块化,易于理解和调试。

#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);
}

1 个答案:

答案 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,这也(通常)会导致段错误。