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

标签 c arrays pointers

我在 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/

相关文章:

java - BufferedReader readLine 在使用 C 客户端和 Java 服务器时保持阻塞状态

c - 这足以检测竞争条件吗?

ruby-on-rails - Ruby,多维数组推送错误

c++ - 如何显示常量字符指针的地址

c++ - 使用 std::containers 存储引用,gnu c++98

c - opencv:将 Scalar 转换为 float 或 double 类型

c - 用星号替换帕斯卡三角形中的每个偶数?

javascript - 使用随机排序顺序的 typescript 数组排序

Javascript/Typescript 从一个嵌套数组更新数据到另一个数组

c - 指针和cstring初学者的烦恼