嘿伙计,所以我想做一个功课,我不能整天发现我的节目上的致命错误。让我解释一下: 首先,给出行数,然后给出数组的单元格(对于自由空间只有“。”,对于地雷只有“*”,所有都在没有空格的行中),然后发生崩溃。
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);
}
答案 0 :(得分:5)
首先,这是我调试的内容(实际上我在代码中看到了问题并且只是通过这种方式进行了验证,但这对您有用)。
在文件的头部添加#include <stdio.h>
和#include <stdlib.h>
。
gcc -Wall -O0 -g x.c -o x
使用debug编译而不进行优化。
然后我使用以下内容在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]=='.'){
访问SEGV
时会显示p[N][M]
,但p
的索引只能从0
转到N-1
和0
分别到M-1
。这个循环可能应该是:
for (row=0; row < N;++row){ //Here the things get messy
for ( col = 0 ; col < M ;++col){
if(p[row][col]=='.'){
(请注意更改从row=0
开始,row < N
开始时不是row <= M
,col
也是如此。
你遇到的第二个问题是如何处理边缘:
这样的行:
if (p[row][col-1]=='*' && col > 1)
count=count+1;
应首先具有col > 1
条件 ,因此除非条件为真,否则它们不会计算数组元素。此外,当col
转到0..M-1
时,您需要
if ((col > 0) && (p[row][col-1]=='*'))
count=count+1;
注意我放了一些括号以避免含糊不清。
查看其他边缘时同样适用:
if (p[row][col+1]=='*' && col < M)
count=count+1;
应该是:
if ((col < M-1) && (p[row][col+1]=='*'))
count=count+1;
这应该让你去。但学习使用调试器。