【问题标题】:Segmentation fault when accessing array via pointer通过指针访问数组时出现分段错误
【发布时间】:2017-03-30 09:50:39
【问题描述】:

我有一个全局数组声明为

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)[currentPlayersNumber][otherNumber] = 20; 怎么样?
  • C 数组从 0 开始索引并上升到 N-1...
  • @M.M 已删除:D 睡眠/咖啡太少。
  • 谢谢@SouravGhosh,括号解决了!关于数组从 0 开始,我知道,我只是减小了分配的“宽度”以排除边缘处的错误。

标签: c arrays pointers operator-precedence


【解决方案1】:

检查数据类型。

teamToRead 是指向int [12][8] 数组的指针。

由于operator precedence,下标运算符绑定得比取消引用更高。

所以,如果

  *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;
}

【讨论】:

  • 这个解决方案需要更少的写作,谢谢。但是,我更喜欢 Sourav 的,因为它对我来说似乎更容易理解。一眼就能看出该变量是一个指向二维数组的指针。
猜你喜欢
  • 2018-10-04
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 2011-11-15
  • 2023-03-07
  • 2014-05-01
相关资源
最近更新 更多