C语言中我的扫雷舰代码的分段错误

C语言中我的扫雷舰代码的分段错误,c,minesweeper,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

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

#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;
}
最后,我得到了这个“分段错误(核心转储)”错误。我一直在四处寻找答案,发现当我试图访问一些我无法访问的东西时,就会发生这种情况。任何帮助都将不胜感激。谢谢

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

if(m[i][j-1] == 42)
对于这些语句,您需要检查i和j是否不是0,否则您将访问无效内存

对于这些语句,您需要检查i和j是否不是0,否则您正在访问无效内存

请查看
if(m[i+1][j])
。如果i=row-1,这将等于row。但是由于您只分配了行值,并且寻址从0开始,所以行-1是您能够寻址的最高值。 当i或j分别为零时,也在
if(m[i-1][j])
if(m[i][j-1])

看看
if(m[i+1][j])
。如果i=row-1,这将等于row。但是由于您只分配了行值,并且寻址从0开始,所以行-1是您能够寻址的最高值。
当i或j分别为零时,也在
if(m[i-1][j])
if(m[i][j-1])
处6个字符长将使

//planting mines
for(count = 0; count < row; count ++)
{
    scanf("%s", m[count]);
}
//种植地雷
对于(计数=0;计数<行;计数++)
{
scanf(“%s”,m[count]);
}
缓冲区溢出并将额外的
写入超出限制的内存


另外,我没有看到任何免费的
,假设您一定已经实现了它。

第三次输入
。*//6个字符长
将使

//planting mines
for(count = 0; count < row; count ++)
{
    scanf("%s", m[count]);
}
//种植地雷
对于(计数=0;计数<行;计数++)
{
scanf(“%s”,m[count]);
}
缓冲区溢出并将额外的
写入超出限制的内存


另外,我没有看到任何
免费的
,假设您一定已经实现了这一点。

请同时发布堆栈跟踪,以便显示错误行。我建议使用
-g
标记编译代码,然后在类似
gdb
的调试器下运行exuctable。这将精确定位导致SEG故障的线路。
m[i-1][j]
如果
i
0
m[-1][j]
您的第三个输入长度为6个字符,
…*。
请同时发布堆栈跟踪,以便出现行错误。我建议使用
-g
标志编译代码,然后在类似
gdb
的调试器下运行excutable。这将精确定位导致SEG故障的线路。
m[i-1][j]
如果
i
0
m[-1][j]
第三个输入长度为6个字符。这也适用于数组另一端的
i+1
/
j+1
。这也适用于数组另一端的
i+1
/
j+1