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

C 将数组传递给函数时出现分段错误,c,arrays,segmentation-fault,argument-passing,pass-by-reference,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));

我尝试使用指针将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); 
typedef结构{
字符名[100];
整数运行;
智力状态;
漂浮物;
内特布伦斯;
int wickets;
}玩家;
球员选择投球手(球员*球队){
srand((无符号)时间(null));
int d=rand()%10;
if(第[d]组,第4组){
球员p=团队[d];
返回p;
}
否则{
返回保龄球手(队);
}
}
void updatebowlwickets(球员*球队[],球员保龄球手){
对于(int i=0;i<10;i++)
{
//这里正在生成分段错误。
if(strcmp(团队[i]->name,bowler.name)==0){
团队[i]>wickets+=1;
}
}
}
//通过调用上述方法
球员队伍[2][10];
//代码部分在这里
球员投球手=选择投球手(团队[0]);
更新的球门((球员**)球队[0],投球手);
很抱歉之前上传了错误的代码

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


谢谢

这里发生了一些事情

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

以下是访问C中多维数组的语法:

multi[row][col]
或
*(*(多行)+col)
简明回答:

您正在以以下方式访问数组元素:

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

  *((array + column * height) + row)
这是一个小错误,并导致您超出边界(多维数组是按行排列的)。正确的方法是:

  *((array + row * width) + column)
在你的情况下,这是:

  *((overs + j*20) + i)
当然,您可以随时执行以下操作:

  overs [i][j]

忘记指针方法(其计算结果相同)

此代码是正确的。segfaults的“真实代码”必须是不同的。请发布真实的代码,并确保您测试了与您发布的代码相同的代码,以确认是否发生segfault。感觉像是一个家庭作业问题。请注意,您可以通过调用
initialize(&overs[0][0])来避免强制转换-和类似的强制转换。使用所有警告和调试信息进行编译(
gcc-Wall-g
)。使用调试器(
gdb