No, non perde, dal momento che è stato distrutto dopo che getp() termina;
Il risultato sarà un comportamento indefinito, perché ora si ha un puntatore a un'area di memoria che non contiene più ciò che si pensa di fare e che può essere riutilizzato da chiunque.
Una perdita di memoria si verifica se l'array è stato memorizzato nell'heap senza eseguire una chiamata a free().
char* getp(){
char* p = malloc(N);
//do stuff to p
return p;
}
int main(){
char* p = getp();
//free(p) No leak if this line is uncommented
return 0;
}
Qui, p non viene distrutto perché non è nello stack, ma nell'heap. Tuttavia, una volta terminato il programma, la memoria allocata non è stata rilasciata, causando una perdita di memoria (anche se è stata eseguita una volta che il processo è morto).
[UPDATE]
Se si desidera restituire una nuova c-string da una funzione, avete due opzioni.
- Conservarlo nel mucchio (come l'esempio sopra o come this real example che restituisce una stringa duplicato);
- passare un parametro di buffer
ad esempio:
//doesnt exactly answer your update question, but probably a better idea.
size_t foo (const char* str, size_t strleng, char* newstr);
Qui, si avrebbe dovuto allocare memoria da qualche parte per newstr (potrebbe essere impilate o mucchio) prima di chiamare la funzione foo. In questo caso particolare, restituirebbe la quantità di caratteri in newstr.
Assegna 'arr [0] = 'M';' necessario o era solo per dimostrare un'operazione non banale su 'arr'? – user1717828
@ user1717828 quest'ultimo. –