2016-10-19 24 views
-1

これは私がポインタを使用すると頻繁に発生していました。今日私は同様の問題を持つ1つのコードを持っています。次のコードをデバッグモードで実行すると、コードは完全に正常に実行され、コードブロックで正常に終了します。13.12コードはデバッグモードで正常に動作しますが、通常の実行では失敗します

通常モードで実行しようとすると、セグメンテーションフォルトが発生し、 。コードは基本的にprint_board関数の実行中に中断します。しかし、私はなぜこれが起こるかわかりません。

#include <stdio.h> 
#include <stdlib.h> 

#define boardheight 8 
#define boardwidth 8 
struct Player_symbols{ 
    char symbol; 
    char king_symbol; 
}; 

struct Checker_piece{ 
    char king; 
    int on_board; 
    int num_moves; 
    int player; 
    struct Player_symbols* symbols; 
}; 

int pieces_count[2] = {12,12}; 
struct Checker_piece* player_1_pieces; 
struct Checker_piece* player_2_pieces; 

void initialize_player_pieces(struct Checker_piece* player_pieces, struct Player_symbols* player_symbols, int player_num); 
void initialize_board(struct Checker_piece* checker_board[boardheight][boardwidth],struct Checker_piece* player1,struct Checker_piece* player2); 
void print_board(struct Checker_piece* checker_board[boardheight][boardwidth]); 
int move_piece(struct Checker_piece* checker_board[boardheight][boardwidth], int x,int y,int player); 
void continue_jumping(struct Checker_piece* checker_board[boardheight][boardwidth],int* y,int* x,int player); 
int generate_destination(int x, int *dest_x, int *dest_y, int *dest_y_jump,int dest_y2,int dest_y2_jump,int move_flags,int player); 

int main() 
{ 
    struct Checker_piece* checker_board[boardheight][boardwidth]; 
    //declare and initialize the Checker_piece structures by allocating memory dynamically using a dummy structure to determine its size 
    player_1_pieces = malloc(12*sizeof (struct Checker_piece)); 
    player_2_pieces = malloc(12*sizeof (struct Checker_piece)); 
    struct Player_symbols *player_1_symbols,*player_2_symbols; 

    player_1_symbols = malloc(sizeof (struct Player_symbols)); 
    player_2_symbols = malloc(sizeof (struct Player_symbols)); 

    //initialize the player symbols 
    player_1_symbols->symbol = 'o'; 
    player_1_symbols->king_symbol = 'O'; 
    player_2_symbols->symbol = 'x'; 
    player_2_symbols->king_symbol = 'X'; 

    initialize_player_pieces(player_1_pieces,player_1_symbols,1); 
    initialize_player_pieces(player_2_pieces,player_2_symbols,2); 
    initialize_board(checker_board,player_1_pieces,player_2_pieces); 
    print_board(checker_board); 
    return 0; 
} 

void initialize_player_pieces(struct Checker_piece* player_pieces, struct Player_symbols* player_symbols, int player_num){ 
    int i; 
    for (i = 0; i < 12; i++, player_pieces++) { 
     player_pieces->king='N'; 
     player_pieces->num_moves=0; 
     player_pieces->on_board=1; 
     player_pieces->player=player_num; 
     player_pieces->symbols= player_symbols; 
    } 
} 

void initialize_board(struct Checker_piece* checker_board[boardheight][boardwidth], 
         struct Checker_piece* player1,struct Checker_piece* player2) 
{ 
    int i, j; 
    for(i = 0; i < 3; i++) { 
     for(j = 0; j <= 7; j = j+2) { 
      if(i == 0 || i % 2 == 0) { 
       checker_board[i][j+1] = player1; 
       checker_board[i][j] = malloc(sizeof (struct Checker_piece)); 
      } else { 
       checker_board[i][j] = player1; 
       checker_board[i][j+1] = malloc(sizeof (struct Checker_piece)); 
      } 
      player1++; 
     } 
    } 
    for(; i < 5; i++){ 
     for(j = 0; j < 8; j++){ 
      checker_board[i][j] = malloc(sizeof (struct Checker_piece)); 
     } 
    } 
    for(i = 5; i < 8; i++){ 
     for(j = 0; j <= 7; j = j+2){ 
      if(i == 0 || i % 2 == 0){ 
       checker_board[i][j+1] = player2; 
       checker_board[i][j] = malloc(sizeof (struct Checker_piece)); 
      } else { 
       checker_board[i][j] = player2; 
       checker_board[i][j+1] = malloc(sizeof (struct Checker_piece)); 
      } 
      player2++; 
     } 
    } 
} 
void print_board(struct Checker_piece* checker_board[boardheight][boardwidth]){ 
    int i = 0,j = 0; 
    printf("\n 1 2 3 4 5 6 7 8\n"); 
    printf(" |---|---|---|---|---|---|---|---|\n"); 

    for(i = 0; i < 8; i++) { 
     printf("%d|",(i + 1)); 
     for(j = 0; j < 8; j++) { 
       if(checker_board[i][j]->king != '\r') 
        printf(" %c |",checker_board[i][j]->symbols->symbol); 
       else 
        printf(" |"); 
     } 
     printf("\n"); 
     printf(" |---|---|---|---|---|---|---|---|\n"); 
    } 
} 
+1

'checker_board [i] [j + 1] = ...' 'j = 6'ならば、この行ではどうなると思いますか? –

+0

問題はprint_board関数のどこかにあります。残りのコードは正常に動作しています。私はこの事実をprint_board関数にコメントすることで検証しました。 –

+1

この場合、定義されていない動作*の意味を理解したいでしょう。 –

答えて

0

ソースコードを見ても、デバッガを使用して、私は問題を確認してい::ここで

は私のコードですprint_boardで 1-()、次の値をチェックするテストの場合使用されていない '\' R

void initialize_board(struct Checker_piece* checker_board[boardheight][boardwidth], 
         struct Checker_piece* player1,struct Checker_piece* player2) 
{ 
    int i, j; 
    for(i = 0; i < 3; i++) { 
     for(j = 0; j <= 7; j = j+2) { 
      if(i == 0 || i % 2 == 0) { 
       checker_board[i][j+1] = player1; 
       checker_board[i][j] = malloc(sizeof (struct Checker_piece)); 
       // init at least the king to '\r' 
       checker_board[i][j]->king = '\r'; 
      } else { 
       checker_board[i][j] = player1; 
       checker_board[i][j+1] = malloc(sizeof (struct Checker_piece)); 
       checker_board[i][j+1]->king = '\r'; 
      } 
      player1++; 
     } 
    } 
    for(; i < 5; i++){ 
     for(j = 0; j < 8; j++){ 
      checker_board[i][j] = malloc(sizeof (struct Checker_piece)); 
      checker_board[i][j]->king = '\r'; 
     } 
    } 
    for(i = 5; i < 8; i++){ 
     for(j = 0; j <= 7; j = j+2){ 
      if(i == 0 || i % 2 == 0){ 
       checker_board[i][j+1] = player2; 
       checker_board[i][j] = malloc(sizeof (struct Checker_piece)); 
       checker_board[i][j]->king = '\r'; 
      } else { 
       checker_board[i][j] = player2; 
       checker_board[i][j+1] = malloc(sizeof (struct Checker_piece)); 
       checker_board[i][j+1]->king = '\r'; 
      } 
      player2++; 
     } 
    } 
} 
:王 'パラメータ' initialize_boardで

if(checker_board[i][j]->king != '\r') 

2-()、すべてのmalloc()はのための少なくとも初期化されません'

関連する問題