2

C で 2 次元配列を割り当てて出力しようとしていますが、メソッドは機能しているように見えますが、配列を出力するとセグメンテーション エラーが発生します。何か案は?

#include <stdio.h>
#include<stdlib.h>

#define WALL 1;
#define EMPTY 0;

int rows;
int columns;

int startRow, startCol;

void getPuzzleParams();
void printMaze();
int solve(char** puzzle, int, int);
void findStartAndEnd(char** puzzle);

main() {
getPuzzleParams();

char **puzzle;
puzzle = (char **)malloc(sizeof(char *)*rows);
int y;
for(y = 0; y < rows;y++)
    puzzle[y] = (char *)malloc(sizeof(char)*columns);

FILE *fptr;
char c;
char file_name[20];
int i,j;

printf("Type in the name of the file containing the Field\n");
scanf("%s",file_name);
fptr=fopen(file_name,"r");
for (i=0; i<rows; i++)
    for (j=0; j<columns; j++){
        c=fgetc(fptr); 
        while ( !((c == '1')||(c =='0')) ) c=fgetc(fptr);
        puzzle[i][j]=c;
    }
fclose(fptr);

for (i=0; i<rows; i++) {
    for (j=0; j<columns; j++)  {
        if (j == 0) printf("\n");                
        printf("%c  ",puzzle[i][j]);
    }
}
printf("\n");

printf("print");
//printMaze(puzzle);
printf("find");
findStartAndEnd(puzzle);
printMaze(puzzle);
solve(puzzle, 1, 2);
}

void getPuzzleParams() {
printf("Enter the dimensions of the puzzle which need to be between 5 and 100\n");
printf("Enter the desired number of Rows: ");
scanf("%d", &rows); 
printf("Enter the desired number of Columns: ");
scanf("%d", &columns);
printf("Rows: %d, Columns: %d\n", rows, columns);
if(rows > 100 || rows < 5 || columns > 100 || columns < 5) {
    getPuzzleParams();
}

}

void printMaze(char** puzzle) {
int i,j;
for (i=0; i<rows; i++)
    for (j=0; j<columns; j++)  {
        if (j == 0) printf("\n");                
        printf("%c  ",puzzle[i][j]);
    }
printf("\n");
printf("sdfsdF");
}

void findStartAndEnd(char** puzzle) {
int foundEnterence = 0;
int i;
printf("start");
for(i = 0; i < columns; i++) {
    printf("top row");
    if(puzzle[0][i]=='0') {
        if(!foundEnterence) {
            foundEnterence = 1;
            startRow = 0;
            startCol = i;
            puzzle[0][i] = 'S';
        } else {
            puzzle[0][i] = 'G';
        }
    }
}
for(i = 0; i < rows; i++) {
    if(puzzle[i][rows]=='0') {
        if(!foundEnterence) {
            foundEnterence = 1;
            startRow = i;
            startCol = rows;
            puzzle[i][rows] = 'S';
        } else {
            puzzle[i][rows] = 'G';
        }
    }
}
for(i = columns; i >= 0; i--) {
    if(puzzle[rows][i]=='0') {
        if(!foundEnterence) {
            foundEnterence = 1;
            startRow = rows;
            startCol = i;
            puzzle[rows][i] = 'S';
        } else {
            puzzle[rows][i] = 'G';
        }
    }
}
for(i = rows; i >= 0; i++) {
    if(puzzle[i][0]=='0') {
        if(!foundEnterence) {
            foundEnterence = 1;
            startRow = i;
            startCol = 0;
            puzzle[i][0] = 'S';
        } else {
            puzzle[i][0] = 'G';
        }
    }
}
}

int solve(char** puzzle, int x, int y) {
printf("%c",puzzle[x][y]);

}

malloc の不適切な使用による問題かもしれませんが、いくつかの異なる初期化を試みましたが、成功しませんでした。

編集:コマンドライン出力は次のとおりです。

Enter the dimensions of the puzzle which need to be between 5 and 100
Enter the desired number of Rows: 12
Enter the desired number of Columns: 10
Rows: 12, Columns: 10
Type in the name of the file containing the Field
maze.txt

1  1  1  1  1  1  1  0  1  1  
1  1  0  0  1  0  0  0  0  1  
1  0  0  0  1  0  0  1  1  1  
1  0  0  0  0  0  0  0  0  1  
1  0  1  0  0  1  0  1  1  0  
1  1  0  0  0  1  0  1  1  1  
1  1  0  1  1  0  0  0  0  1  
1  0  1  0  0  1  0  1  0  1  
1  1  1  0  1  0  1  0  1  1  
1  0  0  1  0  1  0  0  0  1  
1  0  0  0  1  1  1  0  1  1  
1  1  1  1  1  1  1  1  1  1  
Segmentation fault
4

2 に答える 2

1

You're crashing in code you haven't pasted. The print completes without error. As you can see, the entire maze has been printed. You aren't seeing print or find because they're in the output buffer which you haven't flushed -- you're crashing before your code gets a chance to flush it.

Use a good debugger to see where the fault is occurring.

于 2012-09-17T02:15:55.880 に答える
1

エラーはおそらく、次のfindStartAndEndような行がある にあります。

if(puzzle[i][rows]=='0') {

if(puzzle[rows][i]=='0') {

まず第一に、変数rowsは行数であり、ご存じのとおり、配列は から0までインデックス付けされて(size - 1)いるため、インデックス付けは である必要がありますrows - 1もう 1 つは、1 番目とrows2 番目の次元の両方を使用することです。一方の次元は 10 しかなく、もう一方の次元は 12 であるため、割り当てられたメモリの制限を超えてしまいます。

于 2012-09-17T02:53:03.340 に答える