我有一个2D数组,代表这样定义的sudoku网格:
int** sudoku = (int**)malloc(sizeof(int*) * 9);
for(i = 0; i < 9; i++)
sudoku[i] = (int*)malloc(sizeof(int) * 9);
我已经通过一个迭代的函数运行,该函数可以通过每个元素和打印,该元素正常运行(显示81个零(。但是,然后,我将其交给另一个功能,该功能将文件从文件读取到此数组中。这就是它的样子(我正在使用一堆printf语句来调试(。
void readSudokuFile(char* filename, int*** grid) {
FILE* file;
int i, j, curr;
file = fopen(filename, "r");
for(i = 0; i < 9; i++) {
for(j = 0; j < 9; j++) {
fscanf(file, "%d", &curr);
*grid[i][j] = curr;
}
}
fclose(file);
}
当功能运行时,它似乎读取了第一行的读取,但是当它到达第二行并试图将值插入Sudoku [1] [0]时,我会得到SEG故障。这就是我的printfs的输出的样子:
Reading line 0...
Reading col 0... got 6
Reading col 1... got 2
Reading col 2... got 4
Reading col 3... got 5
Reading col 4... got 3
Reading col 5... got 9
Reading col 6... got 1
Reading col 7... got 8
Reading col 8... got 7
Reading line 1...
Reading col 0... got 5
Segmentation fault(core dumped)
这是我要阅读的文件:
6 2 4 5 3 9 1 8 7
5 1 9 7 2 8 6 3 4
8 3 7 6 1 4 2 9 5
1 4 3 8 6 5 7 2 9
9 5 8 2 4 7 3 6 1
7 6 2 3 9 1 4 5 8
3 7 1 9 5 6 8 4 2
4 9 6 1 8 2 5 7 3
2 8 5 4 7 3 9 1 6
我正在使用-Wall和-petsathist的GCC编译,并且没有任何编译器警告。
我已经搜索了几个小时,但无济于事,我不确定这里出了什么问题。任何帮助将不胜感激。
为了避免遇到的指针错误,我建议简化您的动态2D阵列分配 ->
int (*array) [Y] = malloc(sizeof(int[X][Y]));
这样访问您的数组 ->
int g=array[0][0];
和这样的设置 ->
array[0][0]=0;
这将大大简化您的解决方案,并且您还将获得一个连续的内存块,其中包含2D阵列作为奖励。如果您不一定必须这样做,这也将简化编写和读取文件,因为您不需要遍历每个元素。
/a
尝试像这样修改您的功能:
void readSudokuFile(char* filename, int** grid) {
// ...
grid[i][j] = curr;
}
并这样调用:
readSudokuFile(filename, sudoku)