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];
[..]
6
задан pistacchio 7 January 2010 в 23:23
поделиться

6 ответов

Вообще-то, я думаю, что ты хочешь

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

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

9
ответ дан 9 December 2019 в 20:44
поделиться

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

sizeof(room)

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

Вам также может понадобиться распределить по-другому, если вам нужен двухмерный массив: смотрите здесь динамическое выделение массивов в C

1
ответ дан 9 December 2019 в 20:44
поделиться

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

1
ответ дан 9 December 2019 в 20:44
поделиться

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

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

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

.
1
ответ дан 9 December 2019 в 20:44
поделиться

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

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
ответ дан 9 December 2019 в 20:44
поделиться

Если я правильно понимаю, вы хотите, чтобы массив указателей на все значения комнаты в карте . Так как есть MAP_WIDTH*MAP_HEIGHT такие значения, нам нужно столько указателей:

room *rooms[MAP_WIDTH*MAP_HEIGHT];

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

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

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];

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

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

0
ответ дан 9 December 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: