C: matriz dinámica de punteros a matriz de estructura

Tengo una estructura y una matriz bidimensional de esas estructuras:

typedef struct { char exit_n; char exit_s; char exit_w; char exit_e; } room; room map[MAP_WIDTH][MAP_HEIGHT]; 

Necesito una serie de punteros de esas estructuras. El siguiente código se comstack, pero no obtengo el resultado deseado. ¿Alguna ayuda? Esto se está volviendo realmente confuso para mí, cualquier explicación sería apreciada.

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

En realidad, creo que quieres.

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

Esto le da una serie de punteros a sus habitaciones.

Estoy bastante seguro de que quieres

 sizeof(room) 

Necesitas asignar suficiente espacio para la estructura. Sólo estás asignando para un puntero.

También es posible que necesite una asignación diferente si desea una matriz 2D: consulte aquí la matriz de asignación dinámica de matrices en C

El principal problema que veo es que estás usando sizeof(room*) . Esto significa que está tomando el tamaño de un puntero a una estructura, que no es lo que desea. Desea asignar el tamaño de la estructura, así que haga ese tamaño de sizeof(room) . Además, use calloc en este caso, no malloc , ya que básicamente está implementando la funcionalidad del primero al multiplicar el número de habitaciones por el tamaño de la habitación.

En su código actual, las rooms convierten en una serie de estructuras de room , no en una serie de punteros. Si desea una matriz de punteros que apuntan a su matriz de map , necesita otra capa de direccionamiento indirecto:

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

(O puede usar sizeof (room *) como su código tiene en lugar de sizeof *rooms ; prefiero escribirlo de esa manera para evitar la duplicación de información de tipo).

Debe asignar espacio para los punteros y para las salas y luego inicializar los punteros para que apunten a las salas.

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

Si comprendo correctamente, querrá una serie de punteros a todos los valores de room en el map . Ya que hay MAP_WIDTH*MAP_HEIGHT tales valores, necesitamos muchos punteros:

 room *rooms[MAP_WIDTH*MAP_HEIGHT]; 

Lo anterior declara rooms como una serie de punteros.

Ahora, para asignar los valores:

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

Básicamente, encontramos la dirección de cada elemento en el map y la almacenamos en la entrada correcta en las rooms .

¿Es esto lo que querías?