当我使用指针时,这经常发生在我身上。今天我有一个类似问题的代码。当我在调试模式下运行以下代码时,代码执行完全正常并在代码块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");
}
}
答案 0 :(得分:0)
查看源代码并使用调试器时,我已确认问题: 1-在print_board()中,进行以下测试 - 如果检查未使用的值&#39; \&#39; r&#39;:
if(checker_board[i][j]->king != '\r')
2-在initialize_board()中,所有malloc()都没有初始化,至少对于&#39; king&#39;参数:
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++;
}
}
}