C中的分段错误与名为填充区的游戏有关

C中的分段错误与名为填充区的游戏有关,c,fault,C,Fault,我正在创建一个游戏,通常被称为填充区,但有数字。然而,我有分割错误的问题。你能告诉我为什么吗?这是我的密码: #include #include void help(int a[20][60],int b[20][60],int i, int j) { if(i-1<20 && i-1>=0 && (i-1!=0 || j!=0) && a[i-1][j]==a[0][0]) { b[i-1][j]

我正在创建一个游戏,通常被称为填充区,但有数字。然而,我有分割错误的问题。你能告诉我为什么吗?这是我的密码:

#include 
#include 

void help(int a[20][60],int b[20][60],int i, int j)
{
    if(i-1<20 && i-1>=0 && (i-1!=0 || j!=0) && a[i-1][j]==a[0][0])
    {
        b[i-1][j]=1;
        help(a,b,i-1,j);
    }
    if(j-1<60 && j-1>=0 && (i!=0 || j-1!=0) && a[i][j]==a[0][0])
    {
        b[i][j-1]=1;
        help(a,b,i,j-1);
    }
    if(i+1<20 && i+1>=0 && a[i+1][j]==a[0][0])
    {
        b[i+1][j]=1;
        help(a,b,i+1,j);
    }
    if(j+1<60 && j+1>=0 && a[i][j+1]==a[0][0])
    {
        b[i][j+1]=1;
        help(a,b,i,j+1);
    }
}

void game(int a[20][60],int b[20][60],int i,int j)
{
    int c;

    scanf("%d",&c);

    for (i=0;i<20;i++)
        for (j=0;j<60;j++)
            if (b[i][j]==b[0][0])
                a[i][j]=c;
}

int end(int a[20][60])
{
    int i,j;

    for (i=0;i<20;i++)
        for (j=0;j<60;j++)
            if (a[i][j]!=a[0][0])
                return 1;

    return 0;
}

int main(int argc, char *argv[]) { 
    int a[20][60],b[20][60],i,j,k;

    srand (time(NULL));

    k=0; 
    for (i=0;i<20;i++) 
        for (j=0; j<60; j++) 
        { 
            b[i][j]=0;
            a[i][j]= rand() % 5 + 1 ; 
        } 

    b[0][0]=1;
    for (i=0;i<20;i++) 
        for (j=0; j<60; j++) 
        { 
            if (j==59)
                printf("%d\n",a[i][j]); 
            else
                printf("%d",a[i][j]); 
        }

    do
    {
        help(a,b,0,0);
        game(a,b,0,0); 
        for (i=0;i<20;i++) 
            for (j=0; j<60; j++) 
            { 
                if (j==59)
                    printf("%d\n",a[i][j]); 
                else
                    printf("%d",a[i][j]); 
            }

        for (i=0;i<20;i++) 
            for (j=0; j<60; j++) 
            { 
                if (j==59)
                    printf("%d\n",b[i][j]); 
                else
                    printf("%d",b[i][j]); 
            }
    }
    while (end(a)==1); 

    return 0; 
}
当我调试并运行它时,它可以正常工作几次,但它会显示segmentation fault并向我显示helpa,b,I-1,j行


我该怎么办?您有什么建议吗?

您没有检查i和j是否同时在边界内-:

在第一个if块中,您没有检查j=0。 类似地,在第二个if块中,不检查i=0。
其余的2个if块也是如此

现在这是一个索引混乱。。。您应该运行MeMeChestand GDB来查找所有已损坏的索引,并考虑重构代码并引入大量的边界检查等。还可以避免堆栈上的硬编码常数和数组。@帕维尔,但是为什么?我至少创造了所有可能的边界检查。什么是memcheck和gdb?我正在使用devcpyour使用带有花括号{}的for循环,没有加上我编辑的缺少的缩进,只是等待它被批准,让阅读变得一团糟。你真的希望其他人为你调试这堆废话吗?这个问题似乎离题了,因为,好吧,看看它。只有编写者应该被要求调试这样的代码。@我这样做了,但它仍然崩溃。很可能,帮助函数正在无限次地调用自己,导致堆栈溢出。