2012-12-23 74 views
1

我有這個代碼的問題,它編譯好。但記憶無法寫入錯誤後,它在亞馬遜上崩潰。調試器說,問題出現在* grid =(grid_t **)malloc(sizeof(grid_t)* GRID_HEIGHT); ,我一定會錯過一些明顯的東西。創建二維結構

我想創建一個指向二維結構的指針。

#define GRID_WIDTH 12 
#define GRID_HEIGHT 22 

typedef struct 
{ 
    int piece; 
    int edge; 
}grid_t; 

grid_t*** grid; 

*grid = (grid_t**)malloc(sizeof(grid_t)*GRID_HEIGHT); 

for(int i = 0 ; i < GRID_HEIGHT ; i++) 
{ 
    *grid[i] = (grid_t*)malloc(sizeof(grid_t)*GRID_WIDTH); 
} 
+4

那麼你提領'grid'(即:'*格= ...'),這是一個未分配指針(無論如何都是上面的代碼)。 – netcoder

+1

不要強制轉換'malloc()'的返回值。 – 2012-12-23 20:42:53

+1

歡迎來到SO。這不是一個代碼審查網站,請問一個具體的技術問題。 –

回答

4

取消引用未分配的指針:

grid_t*** grid; 
*grid = (grid_t**)malloc(sizeof(grid_t)*GRID_HEIGHT); 

grid當你*grid不分配,所以這是不確定的行爲。

如果您要動態分配的二維結構,首先需要在第一級指針(grid_t*)分配足夠的內存:

grid_t** grid; 
grid = malloc(sizeof(*grid) * GRID_HEIGHT); 

然後,你可以用一個循環分配的每個元素:

for(int i = 0 ; i < GRID_HEIGHT ; i++) 
{ 
    grid[i] = malloc(sizeof(**grid) * GRID_WIDTH); 
    // ...then you can do grid[i]->piece = 42; etc.. 
} 

現在,從我所看到的,你可能甚至不需要動態分配。如果你不需要malloc,不使用它,只要使用好醇」數組來代替:

grid_t grid[GRID_HEIGHT][GRID_WIDTH]; 
+0

Tnx,現在我怎麼能得到一個指向網格的指針? – dexter313

+0

@ dexter313:使用addressof運算符('&')? – netcoder

+0

@ dexter313'grid' **是一個指針。如果出於某種原因需要該指針的*地址*(或C中的任何變量),則可以使用'&grid'。這並不明顯,爲什麼你有這樣的需求,但這是如何。 – WhozCraig