2010-01-07 5 views
6

У меня есть структура и двумерный массив этих структур:C: Динамический массив указателей на массив структуры

typedef struct { 
char exit_n; 
char exit_s; 
char exit_w; 
char exit_e; 
} room; 

room map[MAP_WIDTH][MAP_HEIGHT]; 

Мне нужен массив указателей тех структур. Следующий код компилируется, но я не получаю желаемый результат. Любая помощь? Это становится действительно путают меня, любое объяснение будет оценено

room *rooms; 
rooms = (room*)malloc(sizeof(room*) * ROOM_NUM); 
[..] 
rooms[n] = map[room_x][room_y]; 
[..] 

ответ

1

Я уверен, вы хотите

sizeof(room) 

Вам нужно выделить достаточно места для структуры. Вы выделяете только указатель.

Вам также может понадобиться выделить по-другому, если вы хотите 2D массив: смотрите здесь dynamic allocating array of arrays in C

+1

Кстати, в данном конкретном случае sizeof (room) == sizeof (room *) на 32-битной системе: D – mingos

+0

@mingos: хороший глаз! –

1

Основная проблема, которую я вижу, что вы используете sizeof(room*). Это означает, что вы берете размер указателя на структуру, которая не является тем, что вы хотите. Вы хотите выделить размер структуры, поэтому сделайте это sizeof(room). Кроме того, используйте calloc в этом случае, а не malloc, так как вы в основном реализуете функции прежнего, умножая количество комнат на размер комнаты.

+0

это не похоже на создание другого массива _rooms_, где я хочу массив _pointers в комнату_? – pistacchio

+0

А, я понимаю, что вы имеете в виду. Некоторые из других должностей сделали это правильно. – avpx

1

В вашем текущем коде rooms становится массивом структур room, а не массивом указателей. Если вы хотите, массив указателей, что каждая точка на ваш map массив, вам нужен еще один слой косвенности:

room** rooms = malloc(ROOM_NUM * sizeof *rooms); 
// ... 
rooms[n] = &map[room_x][room_y]; 

(Или вы можете использовать sizeof (room *) как ваш код вместо sizeof *rooms, я предпочитаю, чтобы написать его таким образом чтобы избежать дублирования информации о типе.)

+0

ему может понадобиться комната *** 2D-массив указателей на номера –

+1

Мне кажется, что «комнаты» должны быть альтернативным, одномерным способом доступа к «карте» вместо двумерного. – JaakkoK

+0

Я так не думаю. У него номера ROOM_NUM. Я предполагаю, что ROOM_NUM равен произведению размеров карты. room *** не будет работать для 2D-массива. –

9

на самом деле, я думаю, что вы хотите

room** rooms; 
rooms = (room**)malloc(sizeof(room*) * ROOM_NUM); 
[..] 
rooms[n] = &map[room_x][room_y]; 

Это дает вам массив указателей на ваши номера.

0

Вам необходимо выделить место для указателей и для номеров, а затем инициализировать указатели, чтобы указать на номера.

room *rooms; 
room **prooms; 
rooms = (room*)malloc((sizeof(room) + sizeof(room*)) * ROOM_NUM); 
prooms = (room**)(&rooms[ROOM_NUM]); 
for (int ii = 0; ii < ROOM_NUM; ++ii) 
    prooms[ii] = &rooms[ii]; 
0

Если я правильно понимаю, вы хотите, массив указателей на всех room значений в map. Поскольку существует MAP_WIDTH*MAP_HEIGHT таких ценностей, нам нужно, что многие указатели:

room *rooms[MAP_WIDTH*MAP_HEIGHT]; 

выше объявляют rooms как массив указателей.

Теперь, чтобы присвоить значение:

size_t i; 
size_t j; 

for (i=0; i < MAP_WIDTH; ++i) 
    for (j=0; j < MAP_HEIGHT; ++j) 
     rooms[i*MAP_HEIGHT+j] = &map[i][j]; 

Мы в основном найти адрес каждого элемента в map, и хранить его в правильной записи в rooms.

Это то, что вы хотели?

Смежные вопросы