Ошибка сегментации при доступе к массиву через указатель

У меня есть глобальный массив, объявленный как

int Team1[12][8];

Когда я вызываю функцию

int readLineupB(int teamNr){

      int (*teamToRead)[12][8];
      teamToRead = &Team1;

      for (int currentPlayersNumber = 1; currentPlayersNumber<11; currentPlayersNumber++) {
        for (int otherNumber = 1; otherNumber<7; otherNumber++) {
            *teamToRead[currentPlayersNumber][otherNumber] = 20;
        }
    } 
    return 1;
}

он заполняет массив до позиции [10],[3], затем, по-видимому, для [10],[4] я получаю ошибку сегментации, и я не могу понять, почему.

2 ответа

Решение

Проверьте типы данных.

teamToRead это указатель на int [12][8] массив.

Из-за приоритета оператора оператор нижнего индекса связывается выше, чем разыменование.

Итак, в случае

  *teamToRead[currentPlayersNumber][otherNumber] = 20;

ты пытаешься сказать что-то вроде

  *(* ( teamToRead + currentPlayersNumber ) ) [otherNumber] = 20;

где арифметика указателя становится недопустимой, поскольку они учитывают тип указателя и тем самым выходят за пределы.

Чтобы решить эту проблему, вам нужно установить приоритет разыменования с помощью явных скобок, таких как

 (*teamToRead)[currentPlayersNumber][otherNumber] = 20;

Другой вариант - отказаться от указателя на 2-мерный массив и просто использовать указатель на (первый из массива) одномерного массива:

int Team1[12][8];

int readLineupB(int teamNr){
    // declare teamToRead as a pointer to array of 8 ints
    int (*teamToRead)[8];

    // Team1 is of type int x[12][8] that readily decays 
    // to int (*x)[8]
    teamToRead = Team1;

    for (int currentPlayersNumber = 1; currentPlayersNumber<11; currentPlayersNumber++) {
        for (int otherNumber = 1; otherNumber<7; otherNumber++) {
            // no dereference here.
            teamToRead[currentPlayersNumber][otherNumber] = 20;
        }
    }
    return 0;
}
Другие вопросы по тегам