Errore realloc

di il
4 risposte

Errore realloc

Salve, ho realizzato questo programma:
Dato un vettore di N stringhe, verificare se una stringa inserita da tastiera e’ presente nel vettore e stampare a video la posizione in cui si trova o un messaggio che dica che non e’ presente.
Le stringhe hanno dimensione variabile.
e ricevo il seguente errore: *** Error in `./a.out': realloc(): invalid next size: 0x00000000008ee010 ***
Dove ho sbagliato ? Grazie.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DIM 20

typedef struct{
	int dimensione;
	char *stringa;
}ElencoStringhe;

typedef struct{
	int dimensione;
	ElencoStringhe *stringhe;
}VettoreStringhe;

void InserireStringaInVettoreStringhe(int p, char stringa[], VettoreStringhe *ptr_elenco, ElencoStringhe *ptr_stringhe );
void ScrivereDimensioneElenco(int p, VettoreStringhe *ptr_elenco);
void AllocareMemoriaElenco(int dimensione, VettoreStringhe *elenco);
int CalcolareDimensioneStringa(char stringa[]);
ElencoStringhe *LeggerePuntatoreStringa(ElencoStringhe *stringhe, int p);
void AllocareMemoriaStringaInElenco(int dim, ElencoStringhe *stringhe);
void ScrivereStringaInElenco(ElencoStringhe *stringhe, char stringa[]);
int RicercareStringaInVettore(char C_str[], VettoreStringhe elenco, ElencoStringhe *stringhe);
void StampaPosizioneStringa(int posizione);
void StampaEsitoNegativo();

int main(void){
	VettoreStringhe elenco;
	ElencoStringhe stringhe;
	char C_str[] = "gommone"; //stringa da ricercare nel vettore di stringhe, (ricordati che le stringhe hanno il '\0' finale)
	char stringa[DIM]; //stringa da inserire in VettoreStringhe
	int posizione;
	elenco.stringhe = NULL;

	strcpy(stringa, "gommone");
	InserireStringaInVettoreStringhe(1, stringa, &elenco, &stringhe);
	strcpy(stringa, "gommone");
	InserireStringaInVettoreStringhe(2, stringa, &elenco, &stringhe);
	strcpy(stringa, "spiaggia");
	InserireStringaInVettoreStringhe(3, stringa, &elenco, &stringhe);
	strcpy(stringa, "mariorossi");
	InserireStringaInVettoreStringhe(4, stringa, &elenco, &stringhe);

	posizione = RicercareStringaInVettore(C_str, elenco, elenco.stringhe); //restitusice posizione della stringa all'interno dell' elenco oppure se la stringa non è presente restituisce -1
	if (posizione != -1){
		StampaPosizioneStringa(posizione);
	}else StampaEsitoNegativo();

	free(elenco.stringhe);
	free(stringhe.stringa);
	system("pause");
	return 0;
}

void InserireStringaInVettoreStringhe(int p, char stringa[], VettoreStringhe *ptr_elenco, ElencoStringhe *ptr_stringhe ){
	int n = p - 1; //p è la dimensione dell'elenco , n e' il n-esimo elemento dell'elenco
	ScrivereDimensioneElenco(p, ptr_elenco);
	AllocareMemoriaElenco(ptr_elenco->dimensione, ptr_elenco);
	ptr_stringhe->dimensione = CalcolareDimensioneStringa(stringa);
	AllocareMemoriaStringaInElenco(ptr_stringhe->dimensione, LeggerePuntatoreStringa(ptr_elenco->stringhe, n));
	ScrivereStringaInElenco(LeggerePuntatoreStringa(ptr_elenco->stringhe, n), stringa);

	return;
}

void ScrivereDimensioneElenco(int p, VettoreStringhe *ptr_elenco){
	ptr_elenco->dimensione = p;
	return;
}

void AllocareMemoriaElenco(int dimensione, VettoreStringhe *ptr_elenco){
	(ptr_elenco->stringhe) = (ElencoStringhe *) realloc (ptr_elenco->stringhe, dimensione * sizeof(ElencoStringhe));

	return;
}

int CalcolareDimensioneStringa(char stringa[]){
	int dim;

	dim = strlen(stringa);

	return dim;
}

ElencoStringhe *LeggerePuntatoreStringa(ElencoStringhe *ptr_stringhe, int n){
	return (ptr_stringhe + n);
}

void AllocareMemoriaStringaInElenco(int dim, ElencoStringhe *ptr_stringhe){
	(ptr_stringhe->stringa) = (char *) malloc (dim * sizeof(char));

	return;
}

void ScrivereStringaInElenco(ElencoStringhe *ptr_stringhe, char stringa[]){
	strcpy(ptr_stringhe->stringa, stringa);

	return;
}

int RicercareStringaInVettore(char C_str[], VettoreStringhe elenco, ElencoStringhe *ptr_stringhe){
	int i = 0;
	int posizione = -1;
	while (i < elenco.dimensione){
		if (strcmp(C_str,((ptr_stringhe->stringa) + i)) == 0){
			posizione = i;
		}
		i++;
	}
	return posizione;
}

void StampaPosizioneStringa(int posizione){
	printf("La stringa cercata e' presente e la sua posizione e' %d\n", posizione);
	return;
}

void StampaEsitoNegativo(){
	printf("La stringa cercata non e' presente\n");
}

4 Risposte

  • Re: Errore realloc

    Non hai mai usato e inizializzato la variabile

    stringhe.stringa

    di cui dopo fai la free. E il compilatore segnala l'errore.

    Ma questo è solo un errore che impedisce la compilazione. Il problema della realloc è da un'altra parte.
  • Re: Errore realloc

    Ho provato a cancellare i free ma il problema è rimasto. Inoltre il programma sia con i free che senza non funziona proprio e da lo stesso errore, deve esserci qualcosa di sbagliato che non ho capito, magari anche altrove.
    Inoltre stringhe.stringa penso di averlo usato quando ho scritto (ptr_stringhe->stringa) = (char *) malloc (dim * sizeof(char));
  • Re: Errore realloc

    Update:
    se utilizzo una sola volta nel main la funzione InserireStringaInVettoreStringhe tutto funziona correttamente, il problema sorge quando vado a utilizzare più volte questa funzione.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define DIM 20
    
    typedef struct{
    	int dimensione;
    	char *stringa;
    }ElencoStringhe;
    
    typedef struct{
    	int dimensione;
    	ElencoStringhe *stringhe;
    }VettoreStringhe;
    
    void InserireStringaInVettoreStringhe(int p, char stringa[], VettoreStringhe *ptr_elenco, ElencoStringhe *ptr_stringhe );
    void ScrivereDimensioneElenco(int p, VettoreStringhe *ptr_elenco);
    void AllocareMemoriaElenco(int dimensione, VettoreStringhe *elenco);
    int CalcolareDimensioneStringa(char stringa[]);
    ElencoStringhe *LeggerePuntatoreStringa(ElencoStringhe *stringhe, int p);
    void AllocareMemoriaStringaInElenco(int dim, ElencoStringhe *stringhe);
    void ScrivereStringaInElenco(ElencoStringhe *stringhe, char stringa[]);
    int RicercareStringaInVettore(char C_str[], VettoreStringhe elenco, ElencoStringhe *stringhe);
    void StampaPosizioneStringa(int posizione);
    void StampaEsitoNegativo();
    
    int main(void){
    	VettoreStringhe elenco;
    	ElencoStringhe stringhe;
    	char C_str[] = "gommone"; //stringa da ricercare nel vettore di stringhe, (ricordati che le stringhe hanno il '\0' finale)
    	char stringa[DIM]; //stringa da inserire in VettoreStringhe
    	int posizione;
    	elenco.stringhe = NULL;
    
    	strcpy(stringa, "gommone");
    	InserireStringaInVettoreStringhe(1, stringa, &elenco, &stringhe);
    	//strcpy(stringa, "gommone");
    	//InserireStringaInVettoreStringhe(2, stringa, &elenco, &stringhe);
    	//strcpy(stringa, "spiaggia");
    	//InserireStringaInVettoreStringhe(3, stringa, &elenco, &stringhe);
    	//strcpy(stringa, "mariorossi");
    	//InserireStringaInVettoreStringhe(4, stringa, &elenco, &stringhe);
    
    	posizione = RicercareStringaInVettore(C_str, elenco, elenco.stringhe); //restitusice posizione della stringa all'interno dell' elenco oppure se la stringa non è presente restituisce -1
    	if (posizione != -1){
    		StampaPosizioneStringa(posizione);
    	}else StampaEsitoNegativo();
    
    	free(elenco.stringhe);
    	free(stringhe.stringa);
    	system("pause");
    	return 0;
    }
    
    void InserireStringaInVettoreStringhe(int p, char stringa[], VettoreStringhe *ptr_elenco, ElencoStringhe *ptr_stringhe ){
    	int n = p - 1; //p è la dimensione dell'elenco , n e' il n-esimo elemento dell'elenco
    	ScrivereDimensioneElenco(p, ptr_elenco);
    	AllocareMemoriaElenco(ptr_elenco->dimensione, ptr_elenco);
    	ptr_stringhe->dimensione = CalcolareDimensioneStringa(stringa);
    	AllocareMemoriaStringaInElenco(ptr_stringhe->dimensione, LeggerePuntatoreStringa(ptr_elenco->stringhe, n));
    	ScrivereStringaInElenco(LeggerePuntatoreStringa(ptr_elenco->stringhe, n), stringa);
    
    	return;
    }
    
    void ScrivereDimensioneElenco(int p, VettoreStringhe *ptr_elenco){
    	ptr_elenco->dimensione = p;
    	return;
    }
    
    void AllocareMemoriaElenco(int dimensione, VettoreStringhe *ptr_elenco){
    	(ptr_elenco->stringhe) = (ElencoStringhe *) realloc (ptr_elenco->stringhe, dimensione * sizeof(ElencoStringhe));
    
    	return;
    }
    
    int CalcolareDimensioneStringa(char stringa[]){
    	int dim;
    
    	dim = strlen(stringa);
    
    	return dim;
    }
    
    ElencoStringhe *LeggerePuntatoreStringa(ElencoStringhe *ptr_stringhe, int n){
    	return (ptr_stringhe + n);
    }
    
    void AllocareMemoriaStringaInElenco(int dim, ElencoStringhe *ptr_stringhe){
    	(ptr_stringhe->stringa) = (char *) malloc (dim * sizeof(char));
    
    	return;
    }
    
    void ScrivereStringaInElenco(ElencoStringhe *ptr_stringhe, char stringa[]){
    	strcpy(ptr_stringhe->stringa, stringa);
    
    	return;
    }
    
    int RicercareStringaInVettore(char C_str[], VettoreStringhe elenco, ElencoStringhe *ptr_stringhe){
    	int i = 0;
    	int posizione = -1;
    	while (i < elenco.dimensione){
    		if (strcmp(C_str,((ptr_stringhe->stringa) + i)) == 0){
    			posizione = i;
    		}
    		i++;
    	}
    	return posizione;
    }
    
    void StampaPosizioneStringa(int posizione){
    	printf("La stringa cercata e' presente e la sua posizione e' %d\n", posizione);
    	return;
    }
    
    void StampaEsitoNegativo(){
    	printf("La stringa cercata non e' presente\n");
    }
    
  • Re: Errore realloc

    Non puoi andare in ordine?
    L'esercizio non richiede allocazione dinamica

    Di solito si impara per gradi
    1) per gli array uso variabili globali o variabili allocate staticamente
    2) passo agli array dinamici con memory leak (non uso la free)
    3) provo a liberare la memoria con free
    4) provo a riscrivere il programma usando le chiamate a funzione con puntatori
Devi accedere o registrarti per scrivere nel forum
4 risposte