Estoy escribiendo un programador de tareas simple y utilizando la asignación de memoria dinámica en mi cc430F5137. Estoy de acuerdo en que no es una buena práctica, pero por el momento, asumamos que es un requisito de mi aplicación 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;
el tamaño de info_t
es de 8 bytes y el tamaño de index_t
es de 6 bytes.
También lo hago
index_t* m_index;
info_t* m_info;
Luego tengo la función de 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 para programar. En esta función hago
m_info = realloc(m_info,(num_registered_tasks + 1) * sizeof(*m_info));
y luego establezca los valores de .priority, next, task y prev.
Entonces lo hago
m_index = realloc(m_index,(num_registered_tasks + 1) * sizeof(*m_index));
y establezca los valores de tarea e índice.
y hacer num_registered_tasks++;
Mi pregunta es cómo se está comportando realloc()
a este respecto.
Supongamos que mi espacio de memoria,
La 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 llama a esta función, ¿qué pasará? Lo que supongo es que para m_info primero buscará 16 bytes de datos continuos y solo los encontrará después de los primeros 14 bytes, cambiará la dirección de m_info[0]
y copiará el contenido y luego agregará m_info[1]
. Y cuando se llame a m_index
, solo encontrará 12 bytes después de este (14 + 16) bytes y colocará m_index[0]
y m_index[1]
aquí.
Si esto es cierto, ¿se está desperdiciando todo mi espacio anterior?
Si estoy equivocado, ¿cómo funcionará esta función?
¿Cómo puedo utilizar el espacio anterior también?
Necesito index_t
struct para implementar algún tipo de algoritmo de búsqueda, por lo que también es necesario