分段故障访问2D阵列

时间:2017-05-07 21:08:46

标签: c arrays segmentation-fault

我有一个2D数组,表示如下定义的数独网格:

Scanning.objects.filter(product__user=u,product__active=True).distinct('product_id').order_by('product_id', 'datetime')

我通过遍历每个元素和打印的函数运行它,它工作正常(显示81个零)。但是,我将它交给另一个函数,该函数将文件中的网格读入此数组。这是它的样子(用一堆printf语句我用于调试省略)。

q1 = Scanning.objects.filter(product__user=u,product__active=True).values('product_id').distinct().annotate(x=Max('id'))

q2 = Scanning.objects.filter(id__in=[i["x"] for i in q1])

当函数运行时,它似乎读取了第一行的find,但当它到达第二行并尝试在sudoku [1] [0]中插入一个值时,我得到一个seg错误。这是我的printfs输出的结果:

int** sudoku = (int**)malloc(sizeof(int*) * 9);
for(i = 0; i < 9; i++)
    sudoku[i] = (int*)malloc(sizeof(int) * 9);

这是我正在尝试阅读的文件:

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

我正在使用带-Wall和-pedantic的gcc编译,并且没有收到编译器警告。

我用Google搜索了几个小时无济于事,我不确定这里出了什么问题。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

为了避免指针错误你刚刚遇到我建议简化你的动态2D数组分配 - &gt;

int (*array) [Y] = malloc(sizeof(int[X][Y]));

像这样访问您的数组 - &gt;

int g=array[0][0];

并设置如下 - &gt;

array[0][0]=0;

这将大大简化您的解决方案,您还可以获得包含2D阵列作为奖励的连续内存块。这也将简化写入和读取文件,因为如果由于其他原因不一定必须这样做,则不需要遍历每个元素。

/ A

答案 1 :(得分:1)

尝试修改您的功能:

        void readSudokuFile(char* filename, int** grid) {
   // ...
                grid[i][j] = curr;
    }

并像这样调用它:

readSudokuFile(filename, sudoku)
相关问题