Estoy escribiendo un simple programador de tareas y el uso de asignación dinámica de memoria en mi cc430F5137. Estoy de acuerdo en que no es una buena práctica, pero por el momento vamos a suponer que es mi requisito de aplicación para utilizar la asignación de memoria dinámica.
En mi archivo OS.c
Tengo dos estructuras,
typedef struct
{
task_t task;
uint8_t next;
uint8_t prev;
uint8_t priority;
} info_t;
typedef struct
{
task_t task;
uint8_t index;
} index_t;
tamaño de info_t
es de 8 bytes y el tamaño de index_t
es de 6 bytes.
También hago
index_t* m_index;
info_t* m_info;
Luego tengo la función inicializar en la que hago
m_info = NULL;
m_index = NULL;
Ahora tengo una función registerTask(& task)
que toma la dirección de la función a programar. En esta función hago
m_info = realloc(m_info,(num_registered_tasks + 1) * sizeof(*m_info));
y luego establecer los valores de .priority, next,task y prev.
Entonces lo hago
m_index = realloc(m_index,(num_registered_tasks + 1) * sizeof(*m_index));
a y hacer num_registered_tasks++;
Mi pregunta es que cómo es realloc()
comportarse a este respecto.
Supongamos que mi espacio de memoria, Primera tarea está registrada, por lo que tendrá los primeros 8 bytes para m_info[0]
y los siguientes 6 bytes para m_index[0]
. Ahora, cuando mi segunda tarea llame a esta función, ¿qué ocurrirá? Lo que estoy suponiendo es que para m_info primero buscará 16 bytes de datos continuos y sólo los encontrará después de los primeros 14 bytes, cambiará la dirección de m_info[0]
y copiar el contenido y luego añadir m_info[1]
. Y cuando m_index
sólo encontrará 12 bytes después de estos (14 + 16) bytes y colocará m_index[0]
y m_index[1]
aquí.
Si esto es cierto, ¿entonces todo mi espacio anterior se está desperdiciando?
Si me equivoco, ¿cómo funcionará esta función?
¿Cómo puedo aprovechar también el espacio anterior?
Necesito index_t
struct para implementar algún tipo de algoritmo de búsqueda por lo que es necesario también