2 Stimmen

Verwirrung über statische Variablen

Ich habe eine Verwirrung in den Konzepten der statischen integer.when ich eine statische ganze Zahl in Hauptfunktion initialisieren d.h.

static int i;

Im nächsten Schritt wird der statischen Ganzzahl der Wert 0 zugewiesen:

i++;

i wird 1.

Jetzt wird das Programm beendet. Ich möchte wissen, was das Programm beim nächsten Durchlauf produzieren wird. Was würde außerdem passieren, wenn das gesamte Programm geschlossen wird? Ich verstehe, dass die erste Zeile statisch int i ist; daher sollte der nächste Wert, wenn die Funktion das nächste Mal ausgeführt wird, den Wert von i beibehalten, wenn sie zuvor ausgeführt wurde. Wenn ja, welchen Vorteil hat es, eine Variable statisch zu machen? Hat die Variable eine zeitliche Begrenzung oder kann sie für immer gespeichert werden? Welchen Wert würde sie haben, wenn ich die Funktion erneut ausführe?

5voto

Edu Punkte 1899

In C bedeutet "static", dass die Variable einen lokalen Geltungsbereich innerhalb des globalen Speichers hat.

Der Geltungsbereich von Variablen in C ist ein Block. Mit anderen Worten: Variablen können innerhalb des Blocks, in dem sie deklariert wurden, verwendet werden. Und normalerweise behalten sie ihre Werte nur bis zum Ende des Blocks und gehen danach verloren. Beispiel:

{
   int a; 
   // Only a can be used here
   {
      int b;
      // a and b can be used here
      {
         int c;
         // a,b and c can be used here
      }
      //just a and b can be used here. c is not available anymore
    }
    // only a can be used here. Neither b nor c are available anymore
 }

Dies gilt jedoch nicht für globale Variablen, die im gesamten Programm verwendet werden können.

Die andere Ausnahme ist die statische Variable. Sie wird nur innerhalb des Blocks gesehen, behält aber ihren Wert, nachdem der Block vorbei ist.

Wenn Sie also eine statische Variable innerhalb einer Funktion deklarieren, behält sie ihren Wert zwischen den Funktionsaufrufen bei.

Die folgende Funktion hat zum Beispiel eine lokale Variable. Lokale Variablen haben den Geltungsbereich eines Blocks (das bedeutet, dass Sie nur innerhalb des Blocks {}, in dem sie deklariert ist, auf die Variable 'var' zugreifen können, in diesem Fall also innerhalb der Funktion):

void countFunction(void)
{
  int var = 0;
  var = var + 1;
  printf("Value is %d\n", var);
}

Wenn die Variable nicht statisch ist, wird bei jedem Funktionsaufruf "Wert ist 1" ausgegeben, da die Variable auf dem Stack gespeichert ist, der beim Funktionsaufruf zugewiesen und nach der Rückkehr der Funktion wieder freigegeben wird.

Wenn Sie var so ändern, dass es statisch ist,

void countFunction(void)
{
  static int var = 0;
  var = var + 1;
  printf("Value is %d\n", var);
}

Beim ersten Aufruf der Funktion wird var mit 0 initialisiert und die Funktion zeigt "Wert ist 1" an. Beim zweiten Mal wird var jedoch bereits zugewiesen und befindet sich in einem globalen Bereich. Er wird nicht mehr initialisiert und die Funktion zeigt "Wert ist 2" an.

Dies im Rahmen der Programmausführung.

Obwohl eine statische Variable so lange zugewiesen wird, wie Ihr Programm ausgeführt wird, behält sie ihren Wert nicht, wenn Ihr Programm beendet ist (das Programm gibt seinen gesamten Speicher frei). Die einzige Möglichkeit, einen Wert für den nächsten Durchlauf zu erhalten, besteht darin, ihn auf einem nichtflüchtigen Medium wie der Festplatte zu speichern.

Ich hoffe, es hilft.

3voto

Sarfraz Punkte 366217

Es wird 0 wieder, denn mit Kündigung des Programms alle Speicher/Variablen gehen verloren.

Welchen Vorteil hat es also, wenn es statisch zu machen?

Er ist nützlich, solange Sie Ihr Programm nicht beenden :) Es kann zum Beispiel verwendet werden, um zu zählen, wie oft eine Funktion aufgerufen wird, wenn Sie eine statische Variable in dieser Funktion verwenden und diese bei jedem Aufruf inkrementieren. Dies ist nur ein einfaches Beispiel, aber es gibt natürlich noch mehr praktische Anwendungen.

Weitere Lektüre:

C Statische Variablen

1voto

Johannes Rudolph Punkte 34512

Der Wert von i wird beim nächsten Start der Anwendung 0 sein. Die Inialisierung auf 0 ist eine Standardinialisierung (die im Rest von C sehr unüblich ist), die beim Programmstart erfolgt.

Wie stellen Sie sich vor, dass es irgendwo zwischen der Ausführung gespeichert wird? Immer wenn Ihre Anwendung beendet wird, wird der Speicher vom Betriebssystem wieder freigegeben. Daher wird der Speicherblock, in dem i werden ebenfalls verloren gehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X