Ошибка сегментации при доступе к массиву через указатель
У меня есть глобальный массив, объявленный как
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;
}