2015-01-26 118 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