Indirizzo di ritorno della variabile locale in C

che ho le seguenti due funzioni:

1

int * foo() { int b=8; int * temp=&b; return temp; } 

2

 int * foo() { int b=8; return &b; } 

Non ricevo alcun avvertimento per il primo (es. La funzione restituisce l’indirizzo di una variabile locale ) ma so che questo è illegale poiché b scompare dallo stack e ci rimane un puntatore alla memoria indefinita.

Quindi quando devo fare attenzione a restituire l’indirizzo di un valore temporaneo?

Solutions Collecting From Web of "Indirizzo di ritorno della variabile locale in C"

Il motivo per cui non ricevi un avviso nel primo frammento è perché non sei (dal punto di vista del compilatore) che restituisce un indirizzo a una variabile locale.

Stai restituendo il valore di int * temp . Anche se questa variabile potrebbe essere (e in questo esempio è) contenente un valore che è un indirizzo di una variabile locale, il compilatore non salirà lo stack di esecuzione del codice per vedere se questo è il caso.

Nota : entrambi i frammenti sono ugualmente negativi, anche se il compilatore non ti avvisa del primo. Non usare questo approccio.


Dovresti sempre fare attenzione quando restituisci gli indirizzi alle variabili locali; di regola, potresti dire che non dovresti mai .

static variabili static sono tuttavia un caso completamente diverso, che viene discusso in questo thread .

direi che puoi restituire la variabile locale o piuttosto i puntatori a tale IF se è stata allocata dynamicmente da malloc, in quel caso la memoria utilizzata per la memorizzazione della variabile vuole essere in pila ma su heap e non verrà cancellata o riutilizzata dopo uscire dalla funzione come avviene nel caso di variabili locali automatiche (create senza malloc), giusto?

Entrambi gli esempi sono ugualmente scorretti. La mia ipotesi è che il compilatore non vede il pericolo e quindi non emette un avviso quando si memorizza l’indirizzo in una variabile temporanea.

Questa domanda è probabilmente una delle più discusse su StackO. Di seguito, ci sono due risposte di thread simili su StackO che ho trovato interessanti, e probabilmente mi hanno fatto abbandonare questa ctriggers pratica di de-referenziare le variabili locali, nonostante le possibilità che io abbia sbagliato (comportamento indefinito) essere molto sottile.

Ecco una risposta semplice

Mi è particolarmente piaciuta questa risposta.

Ecco un esempio in cui questa ctriggers pratica ha causato un danno reale all’hardware

Questi sono entrambi negativi e un buon compilatore dovrebbe essere in grado di rilevare e avvertire su entrambe le situazioni. Puoi ottenere risultati migliori girando il livello di avviso al massimo (che devi sempre fare comunque) e triggers l’ottimizzazione.