2016-10-19 54 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++; 
     } 
    } 
} 
相關問題