2016-10-19 2 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

'j = 6'이라면 checker_board [i] [j + 1] = ...'이 줄에서 어떻게 될 것이라고 생각하십니까? –

+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++; 
     } 
    } 
} 
01,235 : 왕 파라미터 '는 initialize_board에서

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

2-() 모두의 malloc()은 적어도위한 초기화되지 않은 "

관련 문제