通过指针访问数组时出现分段错误
Segmentation fault when accessing array via pointer
我有一个全局数组声明为
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] 我得到了一个分段错误,我不明白为什么。
检查数据类型。
teamToRead
是指向 int [12][8]
数组的指针。
由于 operator precedence,下标运算符的绑定高于取消引用。
所以,如果
*teamToRead[currentPlayersNumber][otherNumber] = 20;
你想说的是
*(* ( teamToRead + currentPlayersNumber ) ) [otherNumber] = 20;
其中,指针运算变得非法,因为它们遵循指针类型并因此冒险越界。
要解决这个问题,您需要通过显式括号强制取消引用的优先级,例如
(*teamToRead)[currentPlayersNumber][otherNumber] = 20;
另一种选择是放弃指向二维数组的指针,而只使用指向一维数组(数组的第一个)的指针:
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;
}
我有一个全局数组声明为
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] 我得到了一个分段错误,我不明白为什么。
检查数据类型。
teamToRead
是指向 int [12][8]
数组的指针。
由于 operator precedence,下标运算符的绑定高于取消引用。
所以,如果
*teamToRead[currentPlayersNumber][otherNumber] = 20;
你想说的是
*(* ( teamToRead + currentPlayersNumber ) ) [otherNumber] = 20;
其中,指针运算变得非法,因为它们遵循指针类型并因此冒险越界。
要解决这个问题,您需要通过显式括号强制取消引用的优先级,例如
(*teamToRead)[currentPlayersNumber][otherNumber] = 20;
另一种选择是放弃指向二维数组的指针,而只使用指向一维数组(数组的第一个)的指针:
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;
}