我在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的讀取」錯誤。我究竟做錯了什麼?
我在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的讀取」錯誤。我究竟做錯了什麼?
您的代碼正在聲明一個指向指針的數組(三星號數組),而賦值將一個指針指向一個大小爲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
作爲指向數組數組的指針。
非常感謝!這有效(mallocs是cells_x * sizeof)。如果你有一些時間,也許你可以告訴我如何將它放在一個函數中,以便將所有這些東西「隱藏」在一個單獨的文件中,並且只調用像initGrid(grid,cells_x,cells_y,cells_z)在主要方法? –
@DarbininkaiBroliai當然 - 我編輯,使功能初始化和釋放網格。初始化函數返回一個指針,而不是設置它,因爲我認爲帶一個四個星號的指針(你必須通過'&grid'進行修改纔有可能)作爲參數太多了。 – dasblinkenlight
您是否在'driver.c'中聲明'grid'是全局的? – Kninnug
'雙***網格;'就語言而言不是一個3d數組。 – StoryTeller
See [this](http://stackoverflow.com/questions/14111210/when-two-dimensional-array-and-multidimensional-array-as-function-parameters-in/14111286#14111286) – StoryTeller