Questo e' uno di quei problemi MOOOLTO complicati da identificare, proprio perche' ogni tanto capita ed ogni tanto no.
il fatto che non capiti NON VUL DIRE CHE NON C'E', ma solo che per una congiunzione astrale di eventi, e l'aiuto del Divino Otelma, miracolosamente il problema non si verifica.
Ma come saprai, il Divino Otelma non e' proprio affidabile
Fondamentalmente, quello che sta' succededo e' che hai usato un blocco di memoria CORROTTO: ad esempio lo stai usando ma lo avevi precedentemente deallocato, OPPURE hai scritto PIU' di quello che poteva contenere, oppure, ancora, stai usando un puntatore che non punta all'inizio del blocco allocato.
QUESTO E' IL FONDAMENTALE MOTIVO PER IL QUALE NON SI DOVREBBE MAI GIOCARE l'ARITMETICA DEI PUNTATORI: si risparmia una linea di codice, o 100 byte, ma si introducono rogne che possono richiedere giorni o settimane per poter essere risolti.
Ovviare al problema NON E' di facile soluzione, pero' ci sono alcune tecniche che ti aiutano ALMENO a capire dove POTREBBE stare il problema.
Una tecnica e' la seguente:
devi usare una TUA "malloc" ed una TUA "free" (ad esempio "mymalloc" e "myfree")
Nella "mymalloc" chiami la malloc, ma allochi un po' piu' di spazio, IN TESTA ED IN CODA, e nello spazio aggiunto ci scrivi un NUMERO MAGICO, una sequenza di bit CONOSCIUTA, ad esempio "0xCAFECAFE", e la dimensione del blocco allocato.
Quando chiami la myfree, CONTROLLI CHE IN TESTA ED IN CODA CI SIA ancora il NUMERO MAGICO: se cio' non dovesse accadere, lo segnali sulla console.
In aggiunta, potresti WRAPPARE, con una funzioncina tipo "myptr" OGNI puntatore che usi, e tale funzioncina controlla che IN TEST ed IN CODA al blocco di memoria, ci sia il solito NUMERO MAGICO.
In alternativa, ci sono librerie come la "dmalloc" che aiutano: ma non sono miracolose, fanno in modo piu' professionale lo stesso controllo che ti ho appena descritto.
Non e' difficile da implementare, ma, ovviamente, ci sono diversi dettagli da mettere a punto che richiedono un po' di 'smanettamento'