c - 将数组传递给函数时出现段错误

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

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

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

谢谢!

最佳答案

这里发生了一些事情。

你说访问无效地址时产生段错误。这是真的。通常,这是当内存尚未分配或您尝试访问不存在的内存时,例如第 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。这不会直接导致段错误。未初始化的元素将在内存中包含垃圾/随机值。

关于c - 将数组传递给函数时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26374399/

相关文章:

c - 获取结构中零长度数组元素类型的大小

每次从函数返回时可以重置全局变量的值吗

arrays - 当像素阵列为小型可编辑文本 AS3 时,未生成 8 位 BMP 图像

arrays - 将 SpriteKit 节点动态移动到数组中

c - undefined reference 可能是 makefile 错误?

c - C中的字符配对

c - 指针数组的结构地址

c - 在这里,我试图填充 StudentList,它是一个数组。目前我只显示了 2 个学生,但出现段错误

c - 尝试扫描字符串时如何修复段错误?

c++ - vector::大小和段错误