Il motivo dipende dal fatto che:
- una variabile locale in una funzione viene distrutta all'uscita dalla funzione (e quindi la relativa memoria viene liberata)
- una variabile allocata dinamicamente invece continua ad esistere finchè il programmatore non la libera esplicitamente.
Quindi, chiamando più volte la tua funzione che restituisce direttamente la struct quello che succede è che:
- il compilatore crea la struct in memoria nella prima zona in cui la può creare, diciamo a partire dall'indirizzo 100;
- all'uscita libera nuovamente quella memoria;
- alla chiamata successiva, visto che la memoria non è cambiata, ricrea di nuovo la variabile locale all'indirizzo 100.
Nel secondo caso invece la memoria allocata non viene ovviamente liberata, e quindi la succesiva malloc restituisce un indirizzo diverso dal precedente; se invece prima di chiamare per la seconda volta la funx02() chiami la free() sul puntatore restituito dalla prima chiamata della funx02(), liberando la relativa memoria, potrai notare che il compilatore utilizza di nuovo lo stesso indirizzo di partenza per allocare la struttura:
codice:
int main()
{
struct a* b = funx02();
printf("%d\n", b);
free(b);
b = funx02();
printf("%d\n", b);
getch();
return 0;
}
Infine non puoi dichiarare una funzione che restituisce un array, al massimo puoidichiarare una funzione che restituisce un puntatore e poi restituisce un array nel return, ma alla fine restituisci sempre il valore del puntatore e la memoria a cui esso punta sarà distrutta all'uscita della funzione.