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");
}