使用C中的扫雷代码进行分段错误错误

时间:2017-05-11 04:59:23

标签: c minesweeper

所以我一直在努力解决这个问题,我必须编写一个代码来计算假想雷区某个点附近的地雷数量。这是代码:

#include <stdio.h>
#include <stdlib.h>


int main(void) {
    int row;
    int col;
    int count;
    int mineCount = 0;
    int i;
    int j;

    // allocating memory

    scanf("%d %d", &row, &col);

    char **m = malloc(sizeof(char* ) * row);

    for(i = 0; i < row; i ++)
    {
        m[i] = malloc(sizeof(char) * (col + 1));        //empty minefield
    }

    //planting mines

    for(count = 0; count < row; count ++)
    {
        scanf("%s", m[count]);
    }

    // counting mines

    for(i = 0; i < row; i ++)
    {
        for(j = 0; j < (col + 1); j ++)
        {
            if(m[i][j] != 42)
                {
                    if(m[i-1][j] == 42)
                        mineCount += 1;
                    if(m[i+1][j] == 42)
                        mineCount += 1;
                    if(m[i][j+1] == 42)
                        mineCount += 1;
                    if(m[i][j-1] == 42)
                        mineCount += 1;
                    if(mineCount > 0)
                        m[i][j] = mineCount;
                }
        }
    }

    //printing out the minefield

    for(i = 0; i < row; i ++)
    {
        for(j = 0; j < col; j ++)
            printf("%c", m[i][j]);

        printf("\n");
    }


    return 0;
}

我把&#39; 5 5&#39;对于第一个输入,对于雷区,我的输入将是这样的:

*....
..*..
...*..
.*...
....*
但最后,我得到了这个“分段错误(Core dumped)&#39;错误。我一直在寻找答案,并发现当我尝试访问我无法访问的内容时会发生这种情况。任何帮助,将不胜感激。感谢。

3 个答案:

答案 0 :(得分:3)

if(m[i-1][j] == 42)

if(m[i][j-1] == 42)

对于这些语句,如果i和j不为0,则需要检查,否则您将访问无效内存

答案 1 :(得分:1)

...*.. // 6 char long的第三个输入将生成

//planting mines
for(count = 0; count < row; count ++)
{
    scanf("%s", m[count]);
}

缓冲溢出并将额外的.写入超出范围的内存。

另外,我没有看到任何free,假设您必须已经实现了这一点。

答案 2 :(得分:0)

看看if(m[i+1][j])。如果i = row-1,则这将等于row。但是,由于您只分配了行值,并且寻址从0开始,因此第1行是最高值,您可以解决该问题。 当i或j分别为零时,也在if (m[i-1][j])if(m[i][j-1])