所以我一直在努力解决这个问题,我必须编写一个代码来计算假想雷区某个点附近的地雷数量。这是代码:
#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;错误。我一直在寻找答案,并发现当我尝试访问我无法访问的内容时会发生这种情况。任何帮助,将不胜感激。感谢。
答案 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])
。