我正在尝试使用指针将二维数组传递给函数。该函数将初始化数组。
我在运行时遇到段错误: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/