2016-10-19 50 views
-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] = ...'if'j = 6'(它会是)? –

+0

问题出在print_board函数的某处。其余的代码工作正常。我通过评论print_board函数来验证这个事实。 –

+1

在这种情况下,您可能想要了解术语*未定义行为*的含义。 –

回答

0

当寻找的源代码,并使用同样的调试器,我已经确认问题: 1-在print_board(),下面的测试,如果检查的值其中不使用 '\' R':

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

2-在initialize_board()时,所有的malloc()没有至少初始化为 '王' 参数:

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++; 
     } 
    } 
} 
相关问题