0

doubleポインタとしてグローバルに宣言された2次元配列を出力しようとしましたが、main()の関数で初期化されましたが、コアダンプエラーが発生します。
ここで何が間違っていますか?関数内で初期化された2次元配列の出力

ファイルに格納された配列:

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]); 
     } 
    } 
} 
+0

「M」と「N」はどこに定義されていますか? –

+0

ああ、私はより多くの行を持っていますが、それらを省略しました.MとNはコマンドライン引数です。Mは行数とN列数です。私は質問を更新しました。ありがとう。 –

+0

'initArray()'の 'malloc()'を 'main()'に移動して問題を解決できます。 – CWLiu

答えて

1

あなたが合格値ではなく、参照ではなく、initArray内のmatrixPtrを使って何をしても、initArray-fの外側では違いはありません統一。 、

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

、コールが動作するはずの機能を実行するためにmain()matrix_A=initArray(matrixAfp, 3, 2);を使用して以下のようにinitArray(FILE *matrixFP, int row, int col)を変更するようにしてください。

+0

おかげでたくさんのメソッドがint **でなければなりません。 –

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]); 
+0

ありがとう私は何かのためにargv [2]を使用しています。これは完全なコードではなく、メソッドシグネチャをint **に変更しました。 –

+0

'int **&'を意味しましたか? –

+0

いいえ、CWLiuが最初に提案したものを実装しましたが、そのint ** initArray(FILE * matrixFP、int row、int col); –

関連する問題