In crea_linguaggio_1, sostituisci quello che hai scritto nell'if di continuazione con questo.
if (continua == 1)
{
/* richiesta all'utente dei dati per l'allocazione del linguaggio */
int old_num_seq = *num_sequenze_1;
*num_sequenze_1 += richiedi_righe_linguaggio(esito_lettura);
linguaggio_1 = (char**)realloc(linguaggio_1, *num_sequenze_1 * sizeof(char*));
*linguaggio_1_f = linguaggio_1;
for (copia_i = old_num_seq; copia_i < *num_sequenze_1; copia_i++)
{
linguaggio_1[copia_i] = (char*)malloc(*lunghezza_sequenza_1 * sizeof(char));
}
}
Il motivo per cui crashava - e crashava nelle riallocazioni eseguite nel for loop - è che tentava di riallocare memoria a casaccio.
Spiego meglio:
1) la prima realloc su linguaggio_1 ti rialloca la memoria da lui puntata: quello che hai già scritto rimane inalterato (potenzialmente copiato da un'altra parte), ma il resto non è inizializzato (
https://en.cppreference.com/w/c/memory/reallo)
The reallocation is done by either:
a) expanding or contracting the existing area pointed to by ptr, if possible. The contents of the area remain unchanged up to the lesser of the new and old sizes. If the area is expanded, the contents of the new part of the array are undefined.
2) a questo punto, la vecchia versione del codice, riallocava correttamente le sequenze già inserite (domanda: era proprio necessario?), ma appena arriva al primo elemento nuovo tenta di riallocare un'area di memoria non definita eg prima avevi 4 sequenze, dici di volerne una aggiuntiva, alla iterazione del for in cui copia_1 = 4 leggi riallochi il contenuto di linguaggio_1[4] che punta a un indirizzo di memoria non definito, causando il crash.
Nella mia prova, questo ha risolto il crash che si ottiene con gli steps che hai descritto.
Immagino che una Identica modifica vada fatta nell'altra funzione.
Se ritieni debba essere necessario riallocare tutte le sequenze - e non allocare solo quelle nuove come ho fatto io - essendo chiaro ora quale fosse il problema, la modifica dovrebbe essere facile.