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
。