Значение индекса достигает 5 миллионов для вложенного цикла - C - PullRequest
0 голосов
/ 07 марта 2019

Я программирую настольную игру, и мне нужно присвоить значения персонажей двумерному массиву.Для этого я использую вложенный цикл for с i в качестве индекса строки и j в качестве индекса столбца.С размером 4х4 (n = 4) цикл работает до второй строки.Используя отладчик на codelite, я заметил, что значение j не увеличивается с 0 до 1, как должно, но увеличивается до 5560570, нарушая цикл.Я также заметил, что при использовании измерения больше 4 программа вообще ничего не отображает.Это ошибка памяти?Я в замешательстве и показал это еще нескольким людям.

int main(void){
int n;
char board[n][26];
printf("Enter the board dimension: ");
scanf("%d", &n);
for(int i = 0; i < n; i++){
    for(int j = 0; j < n; j++){
        if((i == (n/2)-1 && j == (n/2)-1) || (i == (n/2) && j == (n/2))){
            board[i][j] = 'W';
        }
        else if((i == (n/2) && j == (n/2)-1) || (i == (n/2)-1 && j == (n/2))){
            board[i][j] = 'B';
        }
        else{
            board[i][j] = 'U';
        }
    }
}

1 Ответ

5 голосов
/ 07 марта 2019

Похоже, что вы используете n до того, как его установите, в объявлении board.Поскольку это неопределенное поведение, абсолютно все разрешено;в этом случае это нарушает значение других переменных.

Чтобы это исправить, вам, вероятно, следует подождать, пока после инициализации n в scanf не будет объявлено board, например:

 int main(void) {
     int n;
     printf("Enter the board dimension: ");
     scanf("%d", &n);
     char board[n][26];
     ...
  }

Как было отмечено в комментариях, это все равно вызовет проблемы, если n > 26, и может быть расточительным для n != 26.Из-за того, как массивы работают в C, исправление, вероятно, потребует переосмысления того, как плата хранится в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...