gpt4 book ai didi

c - 段错误/Dev C 崩溃

转载 作者:行者123 更新时间:2023-12-02 04:34:22 24 4
gpt4 key购买 nike

嘿伙计们,我正在尝试做作业,但我一整天都找不到程序中的 fatal error 。让我解释一下:首先,你给出行数,col 然后是数组的单元格(只有“.”表示空闲空间,“*”表示我的,所有行都没有空格)然后崩溃发生了。

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);
}

最佳答案

首先,这是我调试的(实际上我在代码中看到了问题,只是这样验证的,但这对你有用)。

  1. 添加#include <stdio.h>#include <stdlib.h>在文件的头部。

  2. gcc -Wall -O0 -g x.c -o x进行调试且不进行优化编译。

然后我使用以下命令在 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-10M-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 first 条件,因此除非条件为真,否则它们不会评估数组元素。此外,作为 col0..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;

这应该让你继续。但是学会使用调试器

关于c - 段错误/Dev C 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22285517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com