2016-07-19 310 views
9

Rileggendo il codice di qualcun altro, ho visto qualcosa sintatticamente simile a questo:Perché dichiarare una variabile statica in main?

int main(void) { 
    static int attr[] = {FOO, BAR, BAZ, 0}; 
    /* ... */ 
} 

È questo un errore o c'è qualche ragione per dichiarare una variabile in mainstatic? A quanto ho capito, static impedisce il collegamento e mantiene il valore tra le chiamate. Perché qui è all'interno di una funzione fa solo il secondo, ma main viene invocato solo una volta, quindi non vedo il punto. Questo modifica alcuni comportamenti di compilazione (ad esempio impedendone l'ottimizzazione dall'esistenza)?

+1

IIRC Le variabili 'static' sono posizionate in una sezione diversa. Vedi anche qui: http://stackoverflow.com/questions/93039/where-are-static-variables-stored-in-cc –

+0

sebbene questa sia probabilmente una cattiva pratica ma, formalmente, chi impedisce a te (oa qualcun altro) di chiamare 'main' in modo ricorsivo (più avanti nel codice)? – mvidelgauz

+2

'static' indica che la variabile non è allocata nello stack (memorizzata nel segmento dati o nel segmento BSS). – Rotem

risposta

3

A meno che non si sta facendo qualcosa di molto non standard, come chiamare main direttamente, non ha senso nel dichiarare variabili locali static in main.

Ciò che è utile, tuttavia, è se si dispone di una grande struttura utilizzata in main che sarebbe troppo grande per lo stack. Quindi, dichiarare la variabile come static significa che vive nel segmento di dati.

Essendo static significa anche che, se non inizializzata, la variabile verrà inizializzata con tutti gli 0, proprio come i globali.

6

statico indica inoltre al compilatore di archiviare i dati nella sezione dati della memoria in cui vengono generalmente memorizzati i globali. È possibile utilizzarlo per array di grandi dimensioni che potrebbero sovraccaricare lo stack.

+5

'. Bss' è solo per dati inizializzati di default (solo zeri). Le globali non zero vanno a ".data". – Sergio

+0

https://en.wikipedia.org/wiki/.bss#BSS_in_C concorda. – nebuch

+0

@nebuch: di quale parte di questo paragrafo parli? – blatinox