分段故障打印c中的2d数组

时间:2012-09-17 01:49:19

标签: c segmentation-fault multidimensional-array

我正在尝试在C中分配和打印2d数组,我的方法似乎有效,但是在打印数组时出现了分段错误。有什么想法吗?

#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

2 个答案:

答案 0 :(得分:1)

您在未粘贴的代码中崩溃了。打印完成没有错误。如您所见,整个迷宫都已打印出来。您没有看到printfind因为它们位于您尚未刷新的输出缓冲区中 - 您在代码有机会刷新它之前就崩溃了。

使用一个好的调试器来查看故障发生的位置。

答案 1 :(得分:1)

错误可能在findStartAndEnd,你有这样的行:

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

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

首先,变量rows是行数,您应该知道数组的索引是从0(size - 1),因此索引应为{{1} }。另一件事是你使用rows - 1作为第一个第二维,并且因为其中一个维度只有10而另一个维度是12,你超出了记忆的极限分配