C calloc 3d数组在头文件中定义,读取错误无效

Dar*_*iai 0 c arrays pointers

我在driver.h中初始化了一个3D双数组:

extern double ***grid;
Run Code Online (Sandbox Code Playgroud)

我想在driver.c中设置它的值:

double ***grid;
grid = calloc(cells_x * cells_y * cells_z, sizeof(double)); 
grid[0][1][2] = 123;
Run Code Online (Sandbox Code Playgroud)

但是,valgrind给出"无效读取大小8"错误.我究竟做错了什么?

das*_*ght 5

您的代码声明指向指针的数组(三个星号数组),而赋值将指向单个大小块的指针cells_x * cells_y * cells_z放入其中.这是不正确的,因为extern变量的用户期望一个"锯齿状"数组(即指向指针的数组):

static double*** initGrid(size_t cells_x, size_t cells_y, size_t cells_z) {
    double ***grid;
    grid = malloc(cells_x, sizeof(double**));
    for (size_t x = 0 ; x != cells_x ; x++) {
        grid[x] = malloc(cells_y, sizeof(double*));
        for (size_t y = 0 ; y != cells_y ; y++) {
            grid[x][y] = calloc(cells_z, sizeof(double));
        }
    }
    return grid;
}
static void freeGrid(double ***grid, size_t cells_x, size_t cells_y) {
    for (size_t x = 0 ; x != cells_x ; x++) {
        for (size_t y = 0 ; y != cells_y ; y++) {
            free(grid[x][y]);
        }
        free(grid[x]);
    }
    free(grid);
}
Run Code Online (Sandbox Code Playgroud)

您需要以不同的方式分配和释放锯齿状数组 - 使用多个循环,或者将您声明grid为指向数组数组的指针.