打印在函数中初始化的2d数组,但全局声明

时间:2016-05-21 13:15:02

标签: c debugging pointers multidimensional-array segmentation-fault

我正在尝试打印一个已全局声明为双指针并在main()中的函数内初始化的2d数组,但我收到核心转储错误。
我在这里做错了什么?

存储在文件中的数组:

1 2
3 4
5 6

代码:

#include <stdio.h>
#include <stdlib.h>


int** matrix_A = 0;

void initArray ( int** matrixPtr, FILE* matrixFP, int row, int col );


int main ( int argc, char* argv[] )
{
    FILE* matrixAfp = fopen ( argv[1], "r" );
    int M = atoi ( argv[3] );
    int N = atoi ( argv[4] );
    initArray ( matrix_A, matrixAfp, 3, 2 );
    for ( size_t m = 0; m < M; m++ )
    {
        for ( size_t n = 0; n < N; n++ )
        {
            printf ( "%d \n", matrix_A[m][n] );
        }
    }

    return 0;
}


void initArray ( int** matrixPtr, FILE* matrixFP, int row, int col )
{
    matrixPtr = ( int** ) malloc ( row * sizeof ( int* ) );
    for ( size_t m = 0; m < row; m++ )
    {
        matrixPtr[m] = ( int* ) malloc ( col * sizeof ( int ) );
    }

    for ( size_t n = 0; n < row; n++ )
    {
        for ( size_t o = 0; o < col; o++ )
        {
            fscanf ( matrixFP, "%d", &matrixPtr[n][o] );
        }
    }
}

2 个答案:

答案 0 :(得分:2)

问题是,由于您将matrix_A传递给函数按值,matrixPtr实际上是全局matrix_A的副本,这意味着内部的所有更改该函数发生在matrixPtr而不是全局定义的matrix_A

要解决此问题,您可以通过引用传递它:
void initArray(int** &matrixPtr, FILE *matrixFP, int row, int col)

除此之外,还有:

int M = atoi(argv[3]);
int N = atoi(argv[4]);

应该是:

int M = atoi(argv[2]);
int N = atoi(argv[3]);

答案 1 :(得分:1)

您按值传递指针,而不是通过引用传递,因此无论您在initArray中使用matrixPtr做什么都不会在initArray函数之外产生差异。尝试修改initArray(FILE *matrixFP, int row, int col),如下所示,

int * initArray(FILE *matrixFP, int row, int col){
    int m,n,o;
    int **matrixPtr = (int **)malloc(row * sizeof(int *));

    for (m = 0; m < row; m++) {
        matrixPtr[m] = (int *)malloc(col * sizeof(int));
    }
    for (n = 0; n < row; n++) {
        for (o = 0; o < col; o++) {
            fscanf(matrixFP, "%d", &matrixPtr[n][o]);
        }
    }
    return matrixPtr;
}

使用matrix_A=initArray(matrixAfp, 3, 2);中的main()进行函数调用应该可以正常工作。