我的代码分段错误

时间:2016-05-16 23:19:42

标签: c

我对C很新,但我不知道为什么我会收到此错误。我知道Segmentation Fault是因为超出了我的范围,但我不知道我在哪里。

This is my code

#include <stdlib.h>
#include <stdio.h>
int** totalMatrix(int numRows, int numCols){

    int** firstMatrix;
    int** secondMatrix;
    int** sumMatrix;
    int row, col;

    printf("Enter Matrix A\n");

    firstMatrix = (int**)malloc(numRows * sizeof(int*));
    for(row = 0; row < numRows; row++){
        firstMatrix[row] = (int*)malloc(numCols * sizeof(int));
    }

    for(row = 0; row < numRows; row++){
        for(col = 0; col < numCols; col++){
            scanf("%d", &firstMatrix[row][col]);
        }
    }
    printf("Enter Matrix B\n");

    secondMatrix = (int**)malloc(numRows * sizeof(int*));
    for(row = 0; row < numRows; row++){
        secondMatrix[row] = (int*)malloc(numCols * sizeof(int));
    }

    for(row = 0; row < numRows; row++){
        for(col = 0; col < numCols; col++){
            scanf("%d", &secondMatrix[row][col]);
        }
    }
    printf("A + B =\n");

    sumMatrix = (int**)malloc(numRows * sizeof(int*));
    for(row = 0; row < numRows; ++row){
        for(col = 0; col < numCols; ++col){
            sumMatrix[row][col] = firstMatrix[row][col] + secondMatrix[row][col];
            printf("%d ", sumMatrix[row][col]);
        }
        printf("\n");
    }

    return 0;
}


void delete_matrix(int numRows, int** matrix){
    int row;
    for(row = 0 ; row < numRows; ++row){
        free(matrix[row]);
    }
    free(matrix);
}

int main(){

    int numRows, numCols;

    int** matrix;

    printf("Please Enter the number of rows: ");
    scanf("%d", &numRows);

    printf("Please Enter the number of cols: ");
    scanf("%d", &numCols);

    matrix = totalMatrix(numRows, numCols);

    delete_matrix(numRows, matrix);
    return 0;
}

It works but crashes

提前致谢。

1 个答案:

答案 0 :(得分:0)

对于firstMatrixsecondMatrix,您正确地malloc外部维度,然后在循环中malloc所有内部维度。

出于某种原因,对于sumMatrix,您只有malloc&#39}外部维度。它存储的所有指针都未初始化,但您已经&#39;重新引用它们。

请注意,当我说&#34;正确&#34;时,我会松散地使用这个术语:这是一个很多的不必要的动态分配!喜欢一个大的分配。您可以在单个内存块上映射2D索引。这也可以避免这个错误。

此外,您的函数始终返回0。那是一个空指针。因此,当您在main中使用它并将其传递给delete_matrix时,这是毫无意义的。我完全摆脱了回报并将delete_matrix调用移到了totalMatrix的底部(argh!不一致的函数命名!)看到你确实需要这样做 three < / em>次 - 每个矩阵一次。