Eso de 'a veces' me hace mucha gracia xD
A ver, las variables son variables, da igual el tipo (a un nivel más bajo) son exactamente lo mismo, sean el tipo que sean.
Lo que cambia es cómo interpretas esa variable, esto es, si lees/escribes una variable como un float, como un int o como un boolean (si, un float es lo mismo que un char). De aquí se deduce que los castings a tipos simples (float, int, char etc) no son necesarios, solo sirven para quitarse warnings en compilación.
¿A donde quiero llegar con esto? a que el error está en lo que hagas entre medias con tus mensajes, igual tienes algun puntero revilao que te toca memoria que no quieres, pierdes algún índice, alocas memoria mal... no se, hay algo raro. No es por hacer un fprintf de una cosa u otra.
En fin, si pones más detalles, pos igual hay suerte y viene L0c0 y te pone el código del programa que intentas hacer porque "lo tenía por ahi" (guiño guiño ), o hay más suerte y no lo tiene por ahí y aprendes a hacerlo tu.
Un saludo
PD: Ahora me vendran los puristas a decir que pierdes precisión con castings y tal por el número de bytes que ocupan en memoria unos tipos u otros y blablabla, pero bueno, la idea es lo que hay ahí escrito.