2013-08-15 8 views
5

Per quanto riguarda la mia attuale comprensione della parola chiave 'statica', impedisce che una variabile venga reinizializzata E impedisce alla variabile di lasciare la memoria quando una funzione termina.Ha senso utilizzare variabili statiche nella funzione principale in C?

In C, di solito uso questo quando una variabile non ha bisogno di essere globale, ma anche non dovrebbe cambiare tra le chiamate di funzione. (Microcontrollore F.I. interrompe)

Ora, in qualche codice C per uno STM32, ho visto il seguente:

int main(void) 
{ 
    static char buffer[CONSOLEBUFFERSIZE]; 
    ... 

Per me, questo non ha senso. Questa variabile viene utilizzata per bufferizzare i comandi in entrata per processarli quando viene ricevuto il carattere di terminazione. Ma le due proprietà di "statico" che ho descritto in precedenza non si applicano alla funzione principale perché main() viene chiamato solo una volta e "mai" finisce. Quindi, la mia domanda attuale:

Potrebbe utilizzare un hocus-pocus che non conosco o sarebbe semplicemente copiato il codice da un'interruzione o da un'altra funzione e i programmatori hanno dimenticato o non si sono preoccupati di rimuovere la parola chiave statica ?

+2

se CONSOLVERBUFFERSIZE è molto grande, lo stack può oltrepassare il flusso, quindi utilizzare la statica è sicuro. – sigmalha

+0

Un compilatore C non è obbligato a mettere le variabili di 'main()' nello spazio "stack". Pertanto l'uso di 'static' per spostare una variabile dallo" stack "al segmento" data "dipende dall'implementazione del compilatore. 'static' può cambiare il segmento come suggerito da alcune risposte. Potrebbe anche non avere alcun effetto. – chux

risposta

12

Una differenza è che le variabili statiche di solito utilizzano il segmento di dati del programma anziché lo stack. Forse è questo il motivo per cui si dichiara buffer come static (specialmente se CONSOLEBUFFERSIZE è grande).

+0

Questo in realtà ha perfettamente senso. Non so quali siano i limiti dello stack per questo sistema, ma 64 byte di allocazione permanente nello stack suona come qualcosa che si desidera evitare. Di certo aiuta a prevenire l'overflow dello stack. (64 è il valore corrente di CONSOLEBUFFERSIZE) – Graafvaag

+0

@Eric, corretto, verrà modificato. Grazie –

0

Credo che quando si fa un progetto di c con molti file e di rete per loro, allora il suo valore cambia abitudine ....

+0

Questo è se fosse una variabile globale, quindi saresti libero di esternarlo in altri file e usarlo ... –

3

Su alcuni sistemi lo stack è una dimensione fissa limitate. In questi casi, static è utile semplicemente per spostare il buffer fuori dallo stack e posizionarlo in un punto in cui è stato impostato il linker per allocare più spazio.

Sarebbe anche possibile riconfigurare il linker per offrire uno stack iniziale più grande, ma static è più semplice e fa ancora la cosa giusta.