Saludos, yo tuve un problema muy similar en un programa
que utilizaba buffers con memoria dinámica.
En mi caso el problema se daba porque asignabamos memoria
para cadenas y luego escribíamos sobre esas cadenas saliendonos
de los límites. Un error que el compilador no verifica, el depurador
no verifica, y por supuesto, hacía el que el programa
aborte en cualquier momento mientras se ejecuta.
Por ejemplo, en nuestro programa, luego de sobrepasarnos de
un buffer, al llamar a malloc, calloc o printf (si, printf) el programa
daba un error horrible como ese que nos indicas.
Resulta que cuando el programa realiza una operación de lectura
y escritura, el sistema operativo toma el control y pasa cuentas
del error que cometimos con la memoria.
Si tu caso es similar al que se me presentó con mis amigos, lo
que podrías hacer es utilizar una herramienta como valgrind.
Este programa se ejecuta como simulador de tu sistema, y
emite un reporte completo de todos los detalles erroneos
en tiempo de ejecución, por ejemplo: variables utilizadas
antes de inicializar, salirse de un vector o no liberar memoria
reservada.
Te dejo un ejemplo:
Imagina que tengo este programa en el archivo test.c:
- Código: Seleccionar todo
#include <stdio>
int main(void)
{
int vector[2];
int otro;
printf("El valor de otro es: %d\n", otro);
vector[0] = 0;
vector[1] = 0;
vector[2] = 0;
return 0;
}
Este programa tiene dos errores, utilizo la variable 'otro'
sin inicializar, y luego escribo en una zona no permitida
de un vector (que solo tiene dos posiciones y yo escribo
en tres posiciones).
Para conocer con detalle los errores ejecuto valgrind:
- Código: Seleccionar todo
valgrind ./test
y el resultado que obtengo me da un detalle de todos los
errores que podrían corromper la memoria. Problemas que
se originan en mi código, pero que se trasladan a la
biblioteca de C en donde pueden, literalmente, ¡explotar!:
- Código: Seleccionar todo
....
==6748== Use of uninitialised value of size 4
==6748== at 0x407C186: _itoa_word (_itoa.c:195)
==6748== by 0x407FA81: vfprintf (vfprintf.c:1600)
==6748== by 0x4086F7F: printf (printf.c:35)
==6748== by 0x8048401: main (test.c:9)
==6748==
==6748== Conditional jump or move depends on uninitialised value(s)
==6748== at 0x407C18E: _itoa_word (_itoa.c:195)
==6748== by 0x407FA81: vfprintf (vfprintf.c:1600)
==6748== by 0x4086F7F: printf (printf.c:35)
==6748== by 0x8048401: main (test.c:9)
....
No se si tu problema se resolverá con la misma herramienta,
pero es bueno hacer la prueba. Si un programa tiene un
error, por mas sutil que sea, y corrompe las estructuras de
datos, el error puede originar un fallo dentro de la biblioteca
C. Ten en cuenta que aquí el error llegó hasta _itoa_word, que
ni se lo que significa...
Saludos.