10

関数内に 2 次元配列を作成したので、その配列を返し、他の関数に渡したい..

char *createBoard( ){  
  char board[16][10];
  int j =0;int i = 0;
  for(i=0; i<16;i++){
        for( j=0;j<10;j++){   
                board[i][j]=(char)201;
        }   
  }
  return board;
}

しかし、これは私にエラーを与え続けます

4

8 に答える 8

11

boardスタック上に作成されたオブジェクト ( と呼ばれる配列) へのポインターを返していることを確認してください。配列はスコープ外になると破棄されるため、ポインターは有効なオブジェクトを指しなくなります (ダングリング ポインター)。

を使用して、代わりに配列がヒープに割り当てられていることを確認する必要がありますnew。最新の C++ で動的に割り当てられた配列を作成するための神聖な方法は、std::vectorクラスのようなものを使用することですが、2D 配列を作成しようとしているため、ここではより複雑です。

char **createBoard()
{
    char **board=new char*[16];
    for (int i=0; i<16; i++)
    {
       board[i] = new char[10];
       for (int j=0; j<10; j++)
         board[i][j]=(char)201;
    }

    return board;
}

void freeBoard(char **board)
{
    for (int i=0; i<16; i++)
      delete [] board[i];
    delete [] board;
}
于 2009-04-06T09:15:49.917 に答える
2

このアプローチは機能しません。ローカル変数へのポインターを返すと、未定義の動作が発生します。代わりに、新しい配列をヒープに割り当て、データを手動でインデックス付けしてそこにコピーします。

于 2009-04-06T09:15:21.713 に答える
0

char**代わりに戻る必要がありますchar*

于 2009-04-06T09:11:49.367 に答える
0

あなたの質問に対する簡単な答えは char** です。

そうは言っても、やらないでください!「ボード」変数は、createBoard() の外では持続しません。

boost::multi_arrayを使用して createBoard() への参照として渡すか、直接返します (ただし、そうするとコピーされます)。

于 2009-04-06T09:16:12.397 に答える