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