2017-04-09 11 views
0

私はCでゲームのアトムを作っています。私は移動を追跡するシステムを実装しようとしています。移動するたびに、移動の配列が1つ増えます。それほど効率的ではありません(私はmallocの戻り値をチェックしていないことを知っています)。しかし、今のところ少なくともそれを取得しようとしています。ここで私はそれをやっている方法は次のとおりです。mallocが4回目の呼び出しでプログラムをクラッシュさせます

int move_count_temp = (game->move_count)+1; 
move_t* moves; 

//Check if it's first move 
if (game->moves == NULL) moves = (move_t*)malloc(sizeof(move_t*)); 
else moves = (move_t*)malloc(move_count_temp*sizeof(move_t*)); 

// Copy old moves over 
for (int i=0; i<game->move_count;i++) { 
    moves[i].x = game->moves[i].x; 
    moves[i].y = game->moves[i].y; 
} 

//Copy current move 
moves[move_count_temp-1].x = y_coordinate; 
moves[move_count_temp-1].y = x_coordinate; 

// Free old moves pointer and assign new one 
free(game->moves); 
game->moves = moves; 
game->move_count = move_count_temp; 

問題がmovesをmallocingとき、それは、そのサンプル中の4行目にクラッシュした第四の動きです。私はしばらくそれを修正しようとしていて、なぜそれが起こっているのか分からない。どんな洞察が助けになるでしょう、ありがとう。

P.S.ゲーム構造体にはmove構造体へのポインタがあり、これはmove_t構造体です。

struct move_t { 
    int x; 
    int y; 
}; 

答えて

1

これらの割り当ては間違っている:

if (game->moves == NULL) moves = (move_t*)malloc(sizeof(move_t*)); 
else moves = (move_t*)malloc(move_count_temp*sizeof(move_t*)); 

あなたはmove_t構造、ないmove_t構造体へのポインタのためのスペースを割り当てる必要があります。これが唯一のコードを乱雑にするのに役立つ、

ある
if (game->moves == NULL) { 
    moves = malloc(sizeof *moves); 
} else { 
    moves = malloc(sizeof *moves * move_count_temp); 
} 

は、Cでmalloc()への呼び出しの結果をキャストする理由はありません。これを行うための標準的な方法は、このようなミスを避けることができます。 sizeofオペランドに明示的な型ではなく識別子を使用すると、コードを簡単に保守できるだけでなく、ポストされたコードのエラーを回避できます。

つまり、game->movesを割り当てるにはmalloc()の代わりにrealloc()free()の代わりに投稿コードを使用する必要があります。

+0

すばらしい助けをありがとう!それは今働いているようです(私はC++コンパイラを使用しているのでキャストし、そうでなければエラーを返します)。 – Jayce444

+1

はい、C++にはキャストが必要です。 –

+0

@ Jayce444 C++でCコンパイラやコードを使用すると、C++コンパイラでCコードをコンパイルできません(Cヘッダのみ).CはC++のサブセットではなく、C++はCのスーパーセットではありません。 – 12431234123412341234123

関連する問題