2013-04-25 21 views
10

Qualcuno può dirmi se è accettabile utilizzare le stesse etichette goto in diverse funzioni nello stesso file C?Le stesse etichette goto utilizzate in un file C ma diverse funzioni

per spiegare quello che sto affrontando:

function1() 
{ 
    ... 

    goto label 

    ... 

label: 
    ... 
} 

function2() 
{ 
    ... 

    goto label; 

    ... 

label: 
    ... 
} 

Ora quello che accade è che il codice dopo che l'etichetta viene utilizzato per la pulizia dei dati malloc'ed'. E il tutto si blocca in function2. Ho stampato il mem. luoghi che sono liberi e gli stessi vengono liberati più volte. È questo a causa di tutte le gotos? Questo uso valido dell'istruzione goto?

+1

Formatta correttamente la tua domanda, per favore. – Alex

+0

prova a inserire del codice per ottenere il problema reale ... – akp

+0

Puoi avere gli stessi nomi di etichetta in diverse funzioni ma non puoi usare l'etichetta * che è in un'altra funzione. Il crash non è correlato al nome dell'etichetta che viene riutilizzato. C'è qualcos'altro di sbagliato nel codice che causa il doppio libero. –

risposta

15

Le etichette sono locali, quindi è possibile utilizzare la stessa etichetta in più funzioni.

La domanda su se si dovrebbe usare goto è una questione diversa, e uno che non è facilmente risposta. In breve, non utilizzare goto. Ma come per tutto (specialmente quando si tratta di programmazione) ci sono delle eccezioni in cui goto può essere utile.

+8

E l'uso di goto per la pulizia tende ad essere uno di questi. – Medinoc

+1

goto viene usato molto frequentemente quando il build-up/teardown è complesso (es: kernel Linux) e varie condizioni di uscita riutilizzeranno il codice da altri (es: allocare/rilasciare risorse). In questi casi l'uso di goto è più pulito e garantisce che il meccanismo di caduta esegua esattamente la stessa sequenza tra le varie fasi di demolizione. –

5

Come ha detto Joachim qui, le etichette sono locali; ma nota che le etichette sono locali alle funzioni, non al blocco corrente. Le istruzioni goto non rispettano l'ambito, tranne che per l'ambito della funzione intera.