我有这个代码,它是在二维数组中为渗透模拟制作步骤的函数。
int step (double ** mat, unsigned n, unsigned m, double a, double b)
{
int i, h, r, c, steps, x, y, o, v; // search for minimum
int min;
FILE *fp;
for(steps=0; steps<2; steps++) // percolation steps
{
for (o=0; o<n; o++)
{
for(v=0; v<m; v++)
{
if (mat[o][v]==-2) {mat[o][v]=-1;}
}
} //trasformo i -2 in -1
min=b; //set the minimum to max of range
for(x=0; x<n; x++) // i search in the matrix the invaded boxes
{
for(y=0; y<m; y++)
{
if (mat[x][y]=-1) //control for the boxes
{
if (mat[x][y-1]<=min && mat[x][y-1]>=0) {min=mat[x][y-1]; r=x; c=y-1;} //look for the minimum adjacent left and right
if (mat[x][y+1]<=min && mat[x][y+1]>=0) {min=mat[x][y+1]; r=x; c=y+1;}
for (i=-1; i<=1; i++) //look for the minimum adjacent up and down
{
for(h=-1; h<=1; h++)
{
if (mat[(x)+i][(y)+h]<=min && mat[(x)+i][(y)+h]>=0)
{
min=mat[(x)+i][(y)+h];
r=(x)+i; c=(y)+h;
}
}
}
}
}
}
mat[r][c]=-2;
x=r; y=c;
}
return 0;
}
当我在main
函数中使用它时,我获得了Segmentation-fault (core dump created)
。你知道错误在哪里吗?
答案 0 :(得分:0)
当您尝试访问未分配给程序的内存地址时,会生成分段错误(SF)。您的代码中存在一些错误
if (mat[x][y+1]<=min && mat[x][y+1]>=0)
此处,当y==m-1
时,索引将超出范围。这也适用于循环中的其他一些数组索引
if (mat[x][y]=-1)
这是输入错误,等于比较运算符应为==
。
很难说你的代码的哪一部分对SF负责。它将为您节省大量时间来使用调试器并在运行时捕获故障。然后,您可以看到堆栈跟踪并了解会发生什么。
答案 1 :(得分:0)
分段错误是由程序试图访问的非法内存地址引起的。
我注意到在函数中你有两个for循环,
for (i=-1; i<=1; i++) //look for the minimum adjacent up and down
{
for(h=-1; h<=1; h++)
{
if (mat[(x)+i][(y)+h]<=min && mat[(x)+i][(y)+h]>=0)
{
min=mat[(x)+i][(y)+h];
r=(x)+i; c=(y)+h;
}
}
}
变量'i'&amp; 'h'都从-1开始,这将导致您在开头访问mat [-1] [ - 1],这不是程序访问的合法内存地址。
您应该重新设计循环以避免超出阵列的边界。