Hago un comentario adicional, ya que es un error frecuente de exceso de alocamiento, o mal uso de pasajes por referencia:
Vos en varias de estas funciones tenés una variable en el main y querés pasar por referencia esa variable.
Para ir a un ejemplo más sencillo, veamos un error común que es reservar memoria para un int.
Imaginate que tenes una función exp(int *) que recibe un int por referencia y lo modifica para darte e^x con e el número de Euler. El resultado se trunca digamos para que siga siendo int.
Lo correcto en el main sería esto:
{
int num = 5;
exp(&num);
print(''%d'', num);
}
Ese código de ejemplo funcionaría y te devolvería una impresión en pantalla que diría el número 148 (e^5).
Otra alternativa, esto que pongo abajo, si bien puede funcionar es un uso INCORRECTO de alocación de memoria . Este uso es incorrecto porque int no es un puntero, es un tipo de datos con tamano conocido (sizeofi(int)) y el compilador no requiere alocar memoria, con declararlo el compilador ya asignó memoria para esa variable:
{
int* pnum;
pnum = malloc(sizeof(int));
exp(pnum);
print(''%d'', pnum*);
}
Hacer esto está mal por varios motivos y el primero es la claridad, verdaderamente se vuelve difícil seguir la lógica de algo escrito así. Espero que esto tenga relación con tu pregunta y la de varios compañeros