分段将数组传递给函数时出错

时间:2014-10-15 04:17:38

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

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

我遇到了分段错误:运行时为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,我已经知道在我们尝试访问无效地址时或者当我们用尽分配的内存空间时会产生分段错误操作系统的硬件。如果有任何其他原因或即使陈述的原因有误,请告诉我。

谢谢!

2 个答案:

答案 0 :(得分:1)

这里有一些事情发生了。

您说访问无效地址时会生成段故障。这是真的。通常,当没有分配内存或者您正在尝试访问不存在的内存时,例如第7个元素数组中的第8个元素。这与此处发生的情况类似。

以下是在C:

中访问多维数组的语法

&#13;
&#13;
    multi[row][col]
or
    *(*(multi + row) + col)
&#13;
&#13;
&#13;

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

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

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

其次,您只是将列初始化到第6列。在第二个for循环中使用&#34; j&#34;作为你的计数器,当它应该是7时你的上限是6.这不会直接导致分段错误。未初始化的元素将在内存中包含垃圾/随机值。

答案 1 :(得分:0)

简明回答:

您正在访问数组元素:

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

这是:

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

这有点不对,导致你走出界限(多维数组逐行排列)。正确的方法是:

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

在你的情况下是:

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

当然你可以随时做:

  overs [i][j]

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