0

Cで配列のディープコピーを作成しようとしています(originalBoardがコピーです):

int gy, gx;          
            for (gy=0; gy<9; gy++)
            {
                for (gx=0; gx<9; gx++)
                {                  
                g.originalBoard[gy][gx]=g.board[gy][gx];
                }
            }

これはうまくいかないようで、これは元のボード配列へのポインタを作成しているだけだと思います。

では、解決策はmallocを試して使用することでしょうか?好き:

    int* g.originalBoard[9][9]=malloc(sizeof(g.board[9][9]));

ところで、これは9x9の2次元配列です。構文はどうなりますか(コンパイラーは上記の行に対してエラーを出します...)?

4

3 に答える 3

3

私はあなたがこれを必要とすると思います:

 //assuming g.originalBoard is array of array of integers and same for g.board  
int *originalBoard = malloc(sizeof(g.board));
memcpy(originalBoard, g.board, sizeof(g.board));
于 2012-09-14T20:39:36.473 に答える
0

これは、 memcpyを使用するための正しい場所です。あなたはおそらくしたい

g.originalBoard = (int *)malloc(9 * 9 * sizeof(int));
if (NULL == g.originalBoard) {
    /* malloc failed, so handle the error somehow */
}
memcpy(g.originalBoard, g.board, 9 * 9 * sizeof(int));

g.board[r * 9 + c]上記のソリューションでは、2つのインデックスではなく、インデックス(r、c)のアイテムにアクセスするために使用する必要があることに気付くかもしれません。これは、これがメモリを動的に割り当てる方法のためです-コンパイル時g.boardg.originalBoard、配列ではなく単なるポインタです。または、のタイプの定義を制御gできる場合は、行列のサイズを次のようにハードコーディングできます。

struct foo {
    int board[9][9];
    int originalBoard[9][9];
    /* Other fields here */
};

g.boardそうすれば、とのために余分なスペースをmallocする必要はありません。g.originalBoardこれらの2つのフィールドは、それ自体にスペースを割り当てるたびに自動的に割り当てられますgg.board[r][c]また、の代わりに使用することもできますg.board[r * 9 + c]

于 2012-09-14T20:34:26.270 に答える
0

ちなみに、配列に対して次の「意図された」タスクを実行しようとしている場合は、

int * g.originalBoard [9] [9] = malloc(sizeof(g.board [9] [9]));

次に、上記の行を次のように変更する必要があります

int * g.originalBoard [8] [8] = malloc(sizeof(g.board [8] [8]));

これは9x9の2次元配列であり、C配列ではゼロベースであるためです。

于 2014-04-23T15:16:06.133 に答える