2016-04-12 6 views
1

へのポインタをコピーするとき、次は私のgame.cで私の状況です:memcpyの問題2つのボードのポインタが同じメモリ位置を指して、なぜ私が悩みの理解を抱えている構造体

int game_state_transition(const struct state * s0, const struct move * m, struct state * s1) { 
    memcpy(s1, s0, sizeof(struct state)); 
    memcpy(s1->board, s0->board, sizeof(struct move ***)); 
    if (game_update(s1, m)){ 
     printf("%p\n", s1->board); 
     printf("%p\n", s0->board); 
     game_print(s0); 
     s1->next = s0; 
     return 1; 
    } 

    return 0; 

、ここでは私ですgame.h:

struct state { 
    struct player * current_player; 
    struct move *** board; 
    enum game_status status; 
    const struct state * next; }; 

私は最初のmemcpy後2つのボードのポインタはメモリ内の同じ場所を指していることを理解し、私は第二の行動を理解していません。助けのための

おかげで

+3

ああ、3つ星のプログラマです。 – EOF

+1

'sizeof(struct move ***)'のサイズが間違っています。しかし、あなたは 's1-> board'を' s0-> board'(最初のmemcpyと同じ)に設定するだけなので、2番目のmemcpyは同じソースとターゲットを持っているので未定義の動作を引き起こします。あなたは何をしようとしているのかは言いませんでしたが、ボードのコピーを作成しようとしています。 (もしそうなら、あなたの質問を更新してこの情報を含み、最初にボードをどのように割り当てるかを示す)。 –

+0

また、2回目のmemcpyからどのような動作が観察されたのか(また、何を期待していたのか)も言わなかった。 –

答えて

1

まずmemcpyの呼び出しは、S0を指すものと同じであること、にポイントをs1は何になります。コール前


s0->プレイヤー= 0x000100
s0->移動=この時点からs0->ボードとS1->ボードは、同じポインタ値

memcpy(s1, s0, sizeof(struct state)); 

例があります0x000200
s0->ステータス= 1
s0->状態= 0x000300

S1->プレイヤー= 0x000400
S1->移動= 0x000500
S1->ステータス= 2
S1->状態= 0x000600

呼び出し後:
s0->プレイヤー= 0x000100
s0->移動= 0x000200
s0- >ステータス= 1
s0->状態= 0x000300

S1->プレイヤー= 0x000100
S1->ムーブ= 0x000200
S1->ステータス= 1
s1-> state = 0x000300

2番目のmemcpyにはさらに問題があります。

memcpy(s1->board, s0->board, sizeof(struct move ***)); 

の最初の正しい用語は、(構造体**移動)はsizeofだろうが、すべてのポインタが同じサイズを持っているので、それは、同じ大きさを得られますので、あなたは、ポインタを送ります。

新しいコピーを作成する場合(前の状態を維持するため)、まずメモリを割り当てる必要があります。

Cのプログラミングでは3つの星がよく見られることはありませんが、それは起こります。それは、必要なロジックと、コールスタックでいくつのレベルの変更が可能であるべきかに依存します。最も一般的なのは1と2です(直接ポインタと外部ポイントから変更可能なポインタへの参照を与えます)

関連する問題