2017-02-23 5 views
0

私は初心者ですが、ポインタと他の関数にどのように渡されるのか少し混乱します。私はプロジェクトに取り組んでいます。私の主な機能では、ゲームボードを表すcharの2D配列をmallocします。Cで2次元配列のアドレスにアクセスしようとしたときにセグメント化エラーが発生しました

// In main, allocate 2D array 
char **board = malloc(rows * sizeof(char*)); 
for (int i = 0; i < rows; i++) { 
    board[i] = malloc(cols * sizeof(char)); 
} 

機能は、私のボードの変数をゲームの保存されたバージョンをロードし、したがって再malloc関数れる後で呼び出すことができます。

void stringToGame(char ***board, int *rows, int *cols, int *turn, int *winLength) { 
    // Set new values for rows and cols based on file 
    ... 

    // Malloc board 
    *board = malloc(*rows * sizeof(char*)); 
    for (int i = 0; i < *rows; i++) { 
     *board[i] = malloc(*cols * sizeof(char)); 
    } 

} 

メイン関数でstringToGameメソッドを呼び出すと、ボードのアドレスを渡しています。

stringToGame(&board, &rows, &cols, &turn, &winLength); 

ボードのアドレスを渡しているため、セグメンテーションフォルトが発生していますが、理由はわかりません。

2番目の質問として、私は新しいものをmallocする前にボード用に古い2D配列を解放する必要がありますか?

+0

ボードの割り当て/再割り当て専用の機能があれば、コードを管理しやすくなります。 –

+0

@ M.Mそれは私がそれを全く動かすことができるようになるとすぐに計画です! –

答えて

1

配列添字演算子[]は間接演算子*よりも優先順位が高いので、最初に実行ができますが、逆のことが起こる必要がある、すなわちので、この

*board[i] = malloc(*cols * sizeof(char)); 

(*board)[i] = malloc(*cols * sizeof(char)); 

する必要があります最初に*、次に[i]

0

最初に、宣言した内容は2-d arrayではありません。ダブルポインタです。これら2つの間にdifferenceがあります。

第2に、配列が参照によって渡されるため、配列のアドレスを関数に渡す必要はありません。関数をダブルクリックするだけで、関数にダブルポインタを渡すことができます。あなたは再びそれををmallocする前に

stringToGame(board, &rows, &cols, &turn, &winLength); 

そして、あなたの二次の質問への答えは、はい、あなたはそれ以外の場合は、プログラムがメモリリークを持って、最初の古いポインタをfree必要があります。 boardの最初の値が失われ、それを解放することはできません。

+1

'stringToGame'関数はボードを再割り当てするので、' board'を値で渡すと動作しません –

関連する問題