2016-06-01 8 views

Antwort

3

The wiki sagt:

In der Programmiersprache C, statisch mit globalen Variablen verwendet wird und Funktionen ihren Umfang auf die Datei enthält, einzustellen. In lokalen Variablen wird statisch verwendet, um die Variable in dem statisch zugewiesenen Speicher anstelle des automatisch zugewiesenen Speichers zu speichern. Während die Sprache nicht die Umsetzung der beiden Arten von Speichern diktiert Fall ist, wird statisch zugewiesenen Speicher typischerweise in Daten Segment des Programms zum Zeitpunkt der Kompilierung, während die automatisch zugewiesenen Speicher reserviert normalerweise als transienter Aufrufstapel implementiert ist.

und

statische lokale Variablen: Variablen als statisch in einer Funktion deklariert sind statisch zugewiesen, während den gleichen Umfang wie die automatische lokale Variablen aufweist. Daher bleiben die Werte, die die Funktion in ihre statischen lokalen Variablen während eines Aufrufs setzt, immer noch vorhanden, wenn die Funktion erneut aufgerufen wird.

+0

Vielen Dank Rahul. Also statische Variablen bekommen ihren Speicher zur Kompilierzeit zugewiesen, richtig ?? –

+2

Schätzen Sie, dass die Implementierung nicht in der Sprache angegeben ist. – phoxis

+2

@seereddisekhar Sie werden tatsächlich nicht zur Kompilierzeit zugewiesen. Wenn Sie die ausführbare Datei ausführen, wird der Loader die ausführbare Datei im Speicher entsprechend der Angabe in der ausführbaren Datei beschleunigen. Daher wird die tatsächliche Zuweisung beim Laden stattfinden, aber beim Kompilieren einer Spezifikation werden relative Adressen und Offsets definiert. – phoxis

3

Ja, statische Variablen bleiben zwischen Funktionsaufrufen bestehen. Sie befinden sich wie globale Variablen im Datenbereich des Programms.

Sie können (und sollten wahrscheinlich) mehr über das allgemeine Speicherlayout von C-Anwendungen lesen here.

+0

Datenabschnitt wird nach Abschluss des Funktionsaufrufs nicht gelöscht? –

+0

Nein, wenn der Ausführungsbereich der Funktionen beendet wird. – kaspersky

1

Sie haben eine falsche Annahme gemacht, dass static Variablen auf dem Stapel abgelegt sind *, wenn die Funktion, die sie verwendet, ausgeführt wird, so dass sie gespeichert und abgerufen werden müssen.

Dies ist nicht, wie C es tut: statische Variablen werden in einem ganz anderen Speichersegment außerhalb des Stapels zugewiesen, so dass sie nicht freigegeben werden, wenn die Funktion den Bereich seiner automatischen Variablen beendet.

Normalerweise wird ein statisches Datensegment erstellt und initialisiert, sobald es in das Programm eingegeben wird. Danach bleibt das Segment so lange belegt, wie Ihr Programm läuft. Alle globalen Variablen sowie die statischen Variablen aller Funktionen werden vom Compiler in diesem Segment platziert. Deshalb hat das Eingeben oder Verlassen von Funktionen keine Auswirkung auf diese Variablen.

* Der offizielle Name für "Stapel" ist "automatischer Speicherbereich".

3

einige weitere Informationen auf der zuvor gegebenen Antworten Hinzufügen -

Der Speicher für statische Objekte bei der Kompilierung/link Zeit zugeordnet ist. Ihre Adresse wird vom Linker basierend auf der Linker-Steuerdatei festgelegt.

Die Linker-Datei definiert das physikalische Speicherlayout (Flash/SRAM) und die Platzierung der verschiedenen Programmbereiche.

Die statische Region ist tatsächlich in zwei weitere Abschnitte unterteilt, einen für den Anfangswert und den anderen für Änderungen in der Laufzeit.

Und schließlich, wenn Sie nicht anders angeben, wird der Wert während der Kompilierung auf 0 festgelegt.

0

Betrachten dieses Beispiel:

static int foo; 

void f(void) 
{ 
    static int bar; 
} 

Der einzige Unterschied zwischen foo und bar ist, dass foo hat Umfang Datei während bar Funktionsumfang besitzt. Beide Variablen existieren während der gesamten Lebensdauer des Programms.