2016-07-17 69 views
0

我在driver.h初始化爲這樣的3D雙數組:Ç釋放calloc 3D陣列,無效的讀錯誤

extern double ***grid; 

我想在driver.c設置其值:

double ***grid; 
grid = calloc(cells_x * cells_y * cells_z, sizeof(double)); 
grid[0][1][2] = 123; 

但是,valgrind給出了「無效的大小爲8的讀取」錯誤。我究竟做錯了什麼?

+0

您是否在'driver.c'中聲明'grid'是全局的? – Kninnug

+0

'雙***網格;'就語言而言不是一個3d數組。 – StoryTeller

+0

See [this](http://stackoverflow.com/questions/14111210/when-two-dimensional-array-and-multidimensional-array-as-function-parameters-in/14111286#14111286) – StoryTeller

回答

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

您需要分配,並以不同的方式免費鋸齒狀排列 - 多環,或者聲明你的grid作爲指向數組數組的指針。

+0

非常感謝!這有效(mallocs是cells_x * sizeof)。如果你有一些時間,也許你可以告訴我如何將它放在一個函數中,以便將所有這些東西「隱藏」在一個單獨的文件中,並且只調用像initGrid(grid,cells_x,cells_y,cells_z)在主要方法? –

+0

@DarbininkaiBroliai當然 - 我編輯,使功能初始化和釋放網格。初始化函數返回一個指針,而不是設置它,因爲我認爲帶一個四個星號的指針(你必須通過'&grid'進行修改纔有可能)作爲參數太多了。 – dasblinkenlight