【问题标题】:Segmentation Fault when passing an array to a function将数组传递给函数时出现分段错误
【发布时间】:2014-12-10 01:10:43
【问题描述】:

我正在尝试使用指针将二维数组传递给函数。该函数将初始化数组。

我得到一个分段错误:运行时 11

代码如下

typedef struct {
    char name[100];
    int runs;
    int batstatus;
    float overs;
    int bruns;
    int wickets;
}player;

player selectbowler(player *team) {
    srand((unsigned) time(null));
    int d = rand()%10;
    if(team[d].overs < 4) {
        player p = team[d];
        return p;
    }
    else {
        return selectbowler(team);
    }
}

void updatebowlwickets(player *team[], player bowler) {
    for (int i = 0; i < 10; i++)
    {
        //Segmentation fault was being generated over here.
        if( strcmp(team[i]->name, bowler.name) == 0) {
            team[i]->wickets += 1;
        }
    }
}
//made a call to the above method via
player teams[2][10];
//Code part goes here
player bowler = selectbowler(teams[0]);
updatebowlwickets((player **)teams[0], bowler); 

很抱歉之前上传了错误的代码。

除了你能告诉我什么时候会出现分段错误吗:11,我已经知道如果我们尝试访问无效地址或当我们用完分配的内存空间时会产生分段错误操作系统的硬件。如果有任何其他原因,或者即使陈述的原因有误,请告诉我。

谢谢!

【问题讨论】:

  • 这段代码是正确的。段错误的“真实代码”必须不同。请发布真实代码并确保您已测试与您发布的代码相同以确认发生了段错误。
  • 感觉像是一道作业题。
  • 请注意,您可以通过调用 initialize(&amp;overs[0][0]); 来避免这种类型的转换——并且应该尽可能避免这种类型的转换。
  • 编译时包含所有警告和调试信息 (gcc -Wall -g)。 使用调试器 (gdb)

标签: c arrays segmentation-fault argument-passing pass-by-reference


【解决方案1】:

这里发生了一些事情。

您说访问无效地址时会产生段错误。确实如此。通常是在内存尚未分配或您试图访问不存在的内存时,例如第 7 个元素数组中的第 8 个元素。这与这里发生的情况相似。

这是在 C 中访问多维数组的语法:

    multi[row][col]
or
    *(*(multi + row) + col)

在您的代码中,您按如下方式访问您的元素:

    *((overs+i*7) + j) = -2;
and
    *((overs+i*7) + 6) = 0;

一个错误是您将每一行乘以 7,这会将编译器引用到数组之外的内存。例如,当 i=20 时,您正在尝试访问 overs[140] 而不是 overs[20]。

其次,您只在第 6 列之前初始化列。在以“j”作为计数器的第二个 for 循环中,您的上限是 6,而应该是 7。这不会直接导致分段错误。未初始化的元素将在内存中包含垃圾/随机值。

【讨论】:

    【解决方案2】:

    简洁的答案:

    您正在访问您的数组元素:

      *((overs+i*7) + j)
    

    这是:

      *((array + column * height) + row)
    

    这有点不对,会导致你越界(多维数组是逐行排列的)。正确的做法是:

      *((array + row * width) + column)
    

    你的情况是:

      *((overs + j*20) + i)
    

    当然,你总是可以这样做:

      overs [i][j]
    

    忘记指针方法(它的评估结果相同)

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多