接收信号SIGSEGV分段故障

时间:2015-12-05 14:56:09

标签: c codeblocks

使用本规范,我感到很紧张。 当我尝试运行它时,它会崩溃,如果我尝试调试,它会得到: 程序接收信号SIGSEGV分段故障。

我完全不知道它有什么问题((

以下是代码:

   #include<stdio.h>#include<stdlib.h>
    #include<math.h>
    #define ROWS 11 //Zeilen
    #define COLS 11 //Spalten
    #define MAUSX 5
    #define MAUSY 5
    int a=0;
    int b=0;
    char l=0;


    char arr[ROWS][COLS] =
        {
        {'*','*','*','*','*','*','*','*','*','*','*'},
        {'*','*',' ',' ',' ','*',' ','*',' ',' ','*'},
        {'*',' ','*','*',' ',' ',' ','*',' ',' ','*'},
        {'*',' ',' ','*',' ','*',' ',' ','*',' ','*'},
        {'*','*',' ','*',' ',' ','*',' ',' ',' ','*'},
        {'*',' ',' ',' ',' ','o','*',' ','*','*','*'},
        {'*',' ','*',' ','*','*','*',' ','*',' ','A'},
        {'*',' ','*','*',' ',' ',' ',' ','*',' ','*'},
        {'*',' ','*',' ','*',' ','*','*','*',' ','*'},
        {'A',' ','*',' ',' ',' ',' ',' ',' ',' ','*'},
        {'*','*','*','*','*','*','*','*','*','*','*'},
        };


    void ifo(int x,int y){


    if(arr[y+1][x]==' ' && arr[y][x-1]==' ') {a=y;b=x;}
    if(arr[y+1][x]==' ' && arr[y-1][x]==' ') {a=y;b=x;}
    if(arr[y+1][x]==' ' && arr[y][x+1]==' ') {a=y;b=x;}
    if(arr[y][x-1]==' ' && arr[y-1][x]==' ') {a=y;b=x;}
    if(arr[y][x-1]==' ' && arr[y][x+1]==' ') {a=y;b=x;}
    if(arr[y-1][x]==' ' && arr[y][x+1]==' ') {a=y;b=x;}
    }




    int suche(int x, int y){


    ifo(x, y);


    if(l%2){
    if(arr[y][x-1]=='A') { void ausgabe(); }
    if(arr[y][x+1]=='A') { void ausgabe(); }
    if(arr[y][x-1]==' ') {x--; arr[y][x]='o'; suche(x,y);}
    if(arr[y+1][x]==' ') {y++; arr[y][x]='o'; suche(x,y);}
    if(arr[y][x+1]==' ') {x++; arr[y][x]='o'; suche(x,y);}
    if(arr[y-1][x]==' ') {y--; arr[y][x]='o'; suche(x,y);}
    }
    else{
    if(arr[y][x-1]=='A') { void ausgabe();}
    if(arr[y][x+1]=='A') { void ausgabe(); }
    if(arr[y-1][x]==' ') {y--; arr[y][x]='o'; suche(x,y);}
    if(arr[y][x+1]==' ') {x++; arr[y][x]='o'; suche(x,y);}
    if(arr[y+1][x]==' ') {y++; arr[y][x]='o'; suche(x,y);}
    if(arr[y][x-1]==' ') {x--; arr[y][x]='o'; suche(x,y);}
    }


    while(1){


    if(y==a && x==b){ l++; break;}
    if(arr[y][x-1]=='A') { void ausgabe(); }
    if(arr[y][x+1]=='A') { void ausgabe(); }
    if(arr[y-1][x]=='o') { arr[y][x]=' '; y--; }
    if(arr[y][x+1]=='o') { arr[y][x]=' '; x++; }
    if(arr[y+1][x]=='o') { arr[y][x]=' '; y++; }
    if(arr[y][x-1]=='o') { arr[y][x]=' '; x--; }


    }
    suche(x,y);
    }




    void ausgabe(){


        for(int j=0;j<COLS;j++){


        for(int i=0;i<ROWS;i++){


        printf("%c ", arr[j][i]);
        }
        printf("\n");
        }
        exit(0);


    }


        int  main (){




    suche(9,7);




        return 0;}

解释甚至发生的事情:

我得到了一个[11] [11]元素的charackter数组,在点5,5处有一个'O'。 代码检查所有方向,如果它是一个空格,它会移动到该坐标,并用'O'标记它。

else{if(arr[y][x-1]=='A') { void ausgabe();}
if(arr[y][x+1]=='A') { void ausgabe(); }
if(arr[y-1][x]==' ') {y--; arr[y][x]='o'; suche(x,y);}
if(arr[y][x+1]==' ') {x++; arr[y][x]='o'; suche(x,y);}
if(arr[y+1][x]==' ') {y++; arr[y][x]='o'; suche(x,y);}
if(arr[y][x-1]==' ') {x--; arr[y][x]='o'; suche(x,y);} }

当它到达某一点时,他无法向另一个方向移动,因为他被困在星星'*'中,他将会到达他至少有两个选择去的最后一点。 这一点保存在: void ifo(int x,int y){

if(arr[y+1][x]==' ' && arr[y][x-1]==' ') {a=y;b=x;}
if(arr[y+1][x]==' ' && arr[y-1][x]==' ') {a=y;b=x;}
if(arr[y+1][x]==' ' && arr[y][x+1]==' ') {a=y;b=x;}
if(arr[y][x-1]==' ' && arr[y-1][x]==' ') {a=y;b=x;}
if(arr[y][x-1]==' ' && arr[y][x+1]==' ') {a=y;b=x;}
if(arr[y-1][x]==' ' && arr[y][x+1]==' ') {a=y;b=x;}
}

并且向后移动发生在这一部分:

while(1){

if(y==a && x==b){ l++; break;}
if(arr[y][x-1]=='A') { void ausgabe(); }
if(arr[y][x+1]=='A') { void ausgabe(); }
if(arr[y-1][x]=='o') { arr[y][x]=' '; y--; }
if(arr[y][x+1]=='o') { arr[y][x]=' '; x++; }
if(arr[y+1][x]=='o') { arr[y][x]=' '; y++; }
if(arr[y][x-1]=='o') { arr[y][x]=' '; x--; }


}

他到达后,在现场'a'和'b',他在'L'上加了一个,所以L的模数得到!= 0。这意味着他现在会走另一条路,他上次不会去。 在每一堆Code中,它会询问左侧或右侧的下一步是否等于'A'(出口的德语,出口的英语),如果发生这种情况,它将打印整个数组,然后退出。

void ausgabe(){

    for(int j=0;j<COLS;j++){


    for(int i=0;i<ROWS;i++){


    printf("%c ", arr[j][i]);
    }
    printf("\n");
    }
    exit(0);

 }

我希望我能解释它有点可以理解。抱歉我的英语知识不足。

1 个答案:

答案 0 :(得分:2)

使用调试器。如果您正在使用GDB,则可以使用以下命令停在SEGV:

(gdb) handle SIGSEGV stop

(gdb) r - 运行程序

(gdb) backtrace