分段故障/开发人员C崩溃

分段故障/开发人员C崩溃,c,dev-c++,minesweeper,C,Dev C++,Minesweeper,嘿,伙计们,我正试图做一个家庭作业,但我整天都找不到程序中的致命错误。让我解释一下: 首先,给出行数,col,然后是数组的单元格(对于空闲空间只有“.”,对于地雷只有“*”,都在一行中,没有空格),然后发生崩溃 main(){ int i,col,row,count,N,M,j; char **p; printf("Give number of rows\n"); scanf("%d",&N); printf("Give number of co

嘿,伙计们,我正试图做一个家庭作业,但我整天都找不到程序中的致命错误。让我解释一下: 首先,给出行数,col,然后是数组的单元格(对于空闲空间只有“.”,对于地雷只有“*”,都在一行中,没有空格),然后发生崩溃

main(){
    int  i,col,row,count,N,M,j;
    char **p;
    printf("Give number of rows\n");
    scanf("%d",&N);
    printf("Give number of columns\n");
    scanf("%d\n",&M);
    p=malloc(N*sizeof(char *));   //Saving room for the array
    if (p==NULL)
        return -1;
    for (i=0;i < N ; ++i){
        p[i] = malloc (M * sizeof(char));
        if (*(p+i) == NULL)
            return -1;
    }
    for (i=0; i< N;++i){
        for ( j = 0 ; j < M ;++j)
            scanf("%c",&p[i][j]); //Insert "*" for mines and the rest with "."
    }
    for (row=1; row<= N;++row){           //Here the things get messy
                for ( col = 1 ; col <= M ;++col){
                    if(p[row][col]=='.'){
                        count = 0 ;
                        if(p[row][col+1]=='*' && col < M)
                            count=count+1;
                        if(p[row][col-1]=='*' && col > 1)
                           count=count+1;
                        if(p[row+1][col]=='*' && row < N)
                            count=count+1;
                        if(p[row-1][col]=='*' && row > 1)
                            count=count+1;
                        if(p[row+1][col+1]=='*' && (row < N && col < M))
                            count=count+1;
                        if(p[row+1][col-1]=='*' && (row < N && col > 1))
                            count=count+1;
                        if(p[row-1][col+1]=='*' && ( row > 1 && col < M))
                            count=count+1;
                        if(p[row-1][col-1]=='*' && ( row > 1 && col > 1))
                            count=count+1;
                        printf("%d ", count);
                    }
                    printf("* ");           
                }
                printf("\n");
    }
    printf("\n");
     for (i=0; i< N;++i){       
                for ( j = 0 ; j < M ;++j)
                        printf("%c ",p[i][j]);
        printf("\n");
     }
    for (i = 0 ; i <N ; ++i)
        free(p[i]);
    free(p);
}
main(){
int i,col,row,count,N,M,j;
字符**p;
printf(“给出行数\n”);
scanf(“%d”和“&N”);
printf(“给出列数\n”);
scanf(“%d\n”和&M);
p=malloc(N*sizeof(char*);//为阵列节省空间
if(p==NULL)
返回-1;
对于(i=0;i1))
计数=计数+1;
如果(p[row-1][col+1]='*'&&(row>1&&col1))
计数=计数+1;
printf(“%d”,计数);
}
printf(“*”);
}
printf(“\n”);
}
printf(“\n”);
对于(i=0;i对于(i=0;i首先,以下是我对调试所做的操作(实际上我在代码中看到了问题,并以这种方式进行了验证,但这对您很有用)

  • 在文件头添加
    #include
    #include

  • gcc-Wall-O0-gx.c-ox
    编译时进行调试,无需优化

  • 然后,我使用以下命令在
    gdb
    中运行:

    gdb x
    ...
    (gdb) run
    Starting program: /home/amb/so/x
    warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
    Give number of rows
    1
    Give number of columns
    1
    
    .
    
    Program received signal SIGSEGV, Segmentation fault.
    0x00000000004007d4 in main () at x.c:25
    25                      if(p[row][col]=='.'){
    (gdb) print row
    $1 = 1
    (gdb) print col
    $2 = 1
    (gdb)
    
    看看在不到10秒钟的时间里它是如何告诉我错误在哪里的

    你有两个问题:

    for (row=1; row<= N;++row){           //Here the things get messy
                for ( col = 1 ; col <= M ;++col){
                    if(p[row][col]=='.'){
    
    (请注意,更改为先从
    行=0
    开始,然后将
    更改为非
    行1
    条件,以便它们不会计算数组元素,除非该条件为真。此外,当
    变为
    0..M-1
    时,您需要

    if ((col > 0) && (p[row][col-1]=='*'))
        count=count+1;
    
    注意,为了避免歧义,我在括号中加了一些内容

    当查看其他边时,同样适用:

    if (p[row][col+1]=='*' && col < M)
        count=count+1;
    
    if(p[行][col+1]='*'&&col
    应该是:

    if ((col < M-1) && (p[row][col+1]=='*'))
        count=count+1;
    
    if((列

    这应该会让你走。但要学会使用调试器。

    我不确定帮助做家庭作业是否合乎道德……老实说,所有真正的程序员都是通过追踪seg故障学到了宝贵的第一堂课,你可能不应该让人们从你身上夺走这个机会。OP明确表示这是家庭作业,该公司表示问题,并显示出提供详细信息的合理努力。提供的代码未编译。使用调试器来检测问题。根据源代码和描述,我假设问题是
    数组超出限制的
    我为此苦苦挣扎了4个小时,我找不到解决方案,这就是为什么我最终将其发布在这里。如果我喜欢res,我会调试它检查
    scanf
    的返回值。初始化所有变量。使用大括号
    {}
    即使在
    if
    等之后使用单个语句。之后开始真正查找错误。感谢您的长篇帖子:)在你的评论之后,它运行得很顺利!好吧,老师说他将在下一课教我们关于dbg的知识,所以我不必费心在网上搜索。从乞讨开始,我正在用随机打印修改程序如果合适的话,这篇文章的问题。请原谅我,我只是在主帖子中发表了评论,而不是花时间来给出这样的答案。我也希望这篇文章可以作为一个关于调试器的简单教程,这样人们就可以少用它作为家庭作业的答疑机。如果OP错过了,请在这篇优秀的文章中强调一点;你必须请注意编译器警告,因为如果您的代码有问题,编译器通常会给您提示。您发布的代码应该发出关于
    printf
    malloc
    未声明的警告(后者特别严重)@mattmcnab据我所知,dev-c上没有警告。但是,在linux上没有检查它。
    if (p[row][col+1]=='*' && col < M)
        count=count+1;
    
    if ((col < M-1) && (p[row][col+1]=='*'))
        count=count+1;