2016-07-19 8 views
9

über anderem Code Lesen jemand, sah ich etwas syntaktisch ähnlich wie diese:Warum deklarieren Sie eine statische Variable in main?

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

Ist das ein Fehler oder ist es aus irgendeinem Grund eine Variable in mainstatic zu erklären? Wie ich es verstehe static verhindert Verknüpfung und behält den Wert zwischen den Aufrufen. Weil es hier in einer Funktion ist, tut es nur Letzteres, aber main wird nur einmal aufgerufen, so dass ich den Punkt nicht sehe. Ändert dies das Kompilierungsverhalten (z. B. verhindert es, dass es nicht mehr existiert)?

+1

IIRC 'statische' Variablen werden in einem anderen Abschnitt platziert. Siehe auch hier: http://stackoverflow.com/questions/93039/where-are-static-variables-stored-in-cc –

+0

obwohl dies wahrscheinlich schlechte Praxis ist, aber, formal, wer verhindert, dass Sie (oder jemand anderes) anrufen 'main' rekursiv (später im Code)? – mvidelgauz

+2

'static' bedeutet, dass die Variable nicht im Stack zugeordnet ist (im Datensegment oder im BSS-Segment gespeichert). – Rotem

Antwort

3

Es sei denn, Sie sind etwas sehr Nicht-Standard wie Aufruf main direkt zu tun, gibt es wenig Sinn, in lokalen Variablen static in main erklärt.

Es ist jedoch nützlich, wenn Sie eine große Struktur in main verwendet haben, die für den Stapel zu groß wäre. Wenn Sie die Variable dann als static deklarieren, bedeutet dies, dass sie im Datensegment lebt.

Being static bedeutet auch, dass die Variable, wenn sie nicht initialisiert ist, mit allen Nullen initialisiert wird, genau wie Globals.

6

static weist auch den Compiler an, die Daten im .data-Abschnitt des Arbeitsspeichers zu speichern, in dem Globals normalerweise gespeichert werden. Sie können dies für große Arrays verwenden, die möglicherweise den Stapel überlaufen lassen.

+5

'.bss' ist nur für standardmäßig initialisierte Daten (nur Nullen). Nicht-Null-Globals gehen zu '.data'. – Sergio

+0

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

+0

@nebuch: Über welchen Teil dieses Absatzes sprechen Sie? – blatinox

Verwandte Themen