2015-01-26 113 views
1

我正在開發一個遊戲項目。我的一個結構體包含另一個結構體的矩陣。我無法設法獲得malloc作品。這裏是我的實際代碼:結構矩陣的malloc - C

m->tiles = malloc(sizeof(struct *tile)*width); 

for (i=0; i<width ; i++){ 
    m->tiles[i] = malloc(sizeof(struct tile)*height); 
} 

而且我得到這個錯誤信息:

map.c:111:37: error: expected ‘{’ before ‘*’ token 
m->tiles = malloc(sizeof(struct *tile)*width); 

我從來沒有過的。已經爲int矩陣分配內存,但從未分配結構矩陣。

謝謝。

編輯:謝謝你BLUEPIXY你的答案工作。但我認爲我沒有很好地定義我的結構:

struct map{ 

    int map_width; // Nombre de tiles en largeur 
    int map_height; // Nombre de tiles en hauteur 

    struct tile **tiles; // ensemble des tiles de la map 
}; 

它應該是「struct tile *** tiles」?

+3

'struct * tile' - >'struct tile *'typo – BLUEPIXY 2015-01-26 23:56:41

+0

它不是拼寫錯誤,有兩個星號。 – 2015-01-26 23:57:07

+0

'm-> tiles'是什麼類型? – 2015-01-27 00:01:05

回答

2
struct map{ 
    int map_width; 
    int map_height; 
    struct tile **tiles; 
}; 

... 

m->tiles = malloc(sizeof(struct tile*)*height); 

for (i=0; i<height ; i++){ 
    m->tiles[i] = malloc(sizeof(struct tile)*width); 
} 

註釋

Type **var_name = malloc(size*sizeof(Type *)); 

Type **var_name = malloc(size*sizeof(*var_name)); 
+0

你確定它不是「struct tile *** tiles」,因爲矩陣存儲指向結構的指針(所以**代表矩陣,*代表結構的地址)? – romz34 2015-01-27 00:10:13

+0

只是在您的頭部提取:'tiles [i] ==(*(tiles + i))'''tiles [i] [j] == * (*(瓷磚+我)+ j)',現在數星星:) – sled 2015-01-27 00:13:23

+0

是的,我同意。但是當你定義一個引用另一個結構的結構時,你的代碼是:「struct * other_struct」(其中* other_struct只是一個結構)。這就是爲什麼我問:)。 – romz34 2015-01-27 00:15:25

0

m->tiles = malloc(sizeof(struct *tile)*width); 

應該

m->tiles = malloc(width * sizeof(struct tile *)); 

因此,固定的代碼看起來應該像

m->tiles = malloc(width * sizeof(struct tile *)); 
if (m->tiles == NULL) 
    cannotAllocateMemoryAbortPlease(); 
for (i = 0 ; i < width ; ++i) 
    m->tiles[i] = malloc(height * sizeof(struct tile)); 
+0

哦,是的,我犯了一個錯誤。它是:「m-> tiles [i] = malloc(sizeof(struct tile)* height); – romz34 2015-01-27 00:06:09

+0

@ romz34爲您下次發佈問題時,不要重新鍵入代碼,只需從編輯器中複製它並粘貼它,否則你可能會意外地修復問題,而不會注意到。 – 2015-01-27 00:07:42

+0

一邊注意:你的代碼分配矩陣列主要 – sled 2015-01-27 00:09:24

2

使用struct tile **tiles是足夠的。你可以這樣想:

struct tile_array *tiles顯然足以指向一個tile_array指針數組。現在要避免額外的struct用指向瓦片的指針替換tile_array。因此,您有一個指向tile類型指針的指針。指向tile的指針表示tile s的數組的開始。指向tile指針的指針表示這樣的指針數組的開始。

+0

好的,謝謝你的提示! – romz34 2015-01-27 00:29:14