我在 driver.h 中初始化了一个 3D double 组:
extern double ***grid;
我想在 driver.c 中设置它的值:
double ***grid;
grid = calloc(cells_x * cells_y * cells_z, sizeof(double));
grid[0][1][2] = 123;
但是,valgrind 会给出“大小为 8 的无效读取”错误。我做错了什么?
最佳答案
您的代码声明了一个指向指针的指针数组(三星号数组),而赋值将指向大小为 cells_x * cells_y * cells_z
的单个 block 的指针放入其中。这是不正确的,因为您的 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);
}
您需要以不同的方式分配和释放交错数组 - 使用多个循环,或者将您的 grid
声明为指向数组数组的指针。
关于头文件中定义的 C calloc 3d 数组,无效读取错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38421015/