#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct elementi{
char *w;
};
void modifica(struct elementi **x)
{
int i;
struct elementi *temp;
//alloco ogni elemento della struttura e inserisco un valore
for (i = 0; i< 10; i++){
((*x)[i]).w = (char *)malloc(20*sizeof(char));
strcpy(((*x)[i]).w, "prima della realloc");
}
//realloco
temp = (struct elementi *)realloc(*x, 20*sizeof(struct elementi));
if(temp != NULL){
*x = temp;
}
//alloco i nuovi elementi e inserisco un valore
for (i = 10; i< 20; i++){
((*x)[i]).w = (char *)malloc(20*sizeof(char));
strcpy(((*x)[i]).w, "dopo la realloc");
}
//stampo i valori della struttura
for (i = 0; i< 20; i++){
printf("nella funzione == : %s\n", ((*x)[i]).w);
}
}
int main(int argc, char *argv[])
{
struct elementi *valore;
int i;
valore = (struct elementi *)malloc(10*sizeof(struct elementi));
modifica(&valore);
//stampo ora i valori fuori dalla funzione
for (i = 0; i< 20; i++){
printf("fuori la funzione == %s\n", valore[i].w);
}
return EXIT_SUCCESS;
}
Non ti funzionava perché tu passavi alla funzione modifica il valore contenuto in "valore" ovvero l'indirizzo della prima entry dell'array creato, quindi nello stack di "modifica" la variabile x conteneva tale valore, ora quando effettuavi la realloc l'indirizzo restituito in temp lo assegnavi alla variabile x, pensando che la modifica si ripercuotesse anche su "valore", ma la variabile "valore" non viene modificata, in quanto sono in record di attivazione diversi.
Nel codice che ti postato, ho fatto in modo di passare a "modifica" l'indirizzo della variabile "valore", in modo tale che dalla funzione "modifica" mediante deriferimento riesca effettivamente a modificare il contenuto della memoria relativa alla variabile "valore".
Spero di essere stato chiaro, ciao