Statische Variable innerhalb einer Funktion in C

Lesezeit: 6 Minuten

Vadiklks Benutzeravatar
Wadiklk

Was wird ausgedruckt? 6 6 oder 6 7? Und warum?

void foo()
{
    static int x = 5;
    x++;
    printf("%d", x);
}

int main()
{
    foo();
    foo();
    return 0;
}

  • Was ist das Problem zu versuchen?

    – Andreas

    17. Februar 2011 um 19:32 Uhr

  • Haben Sie versucht, dies einzugeben und selbst zu sehen?

    – wilhelmtel

    17. Februar 2011 um 19:32 Uhr

  • Ich möchte verstehen, warum.

    – Wadiklk

    17. Februar 2011 um 19:33 Uhr

  • @Vadiklk, also stelle die Frage, die mit “Warum” beginnt

    – Andrej

    17. Februar 2011 um 19:33 Uhr

  • ideone.com/t9Bbe Was würden Sie erwarten? Entspricht das Ergebnis nicht Ihren Erwartungen? Warum haben Sie Ihr Ergebnis erwartet?

    – eckes

    17. Februar 2011 um 19:34 Uhr


Hier gibt es zwei Probleme, Lebensdauer und Geltungsbereich.

Der Gültigkeitsbereich der Variable ist dort, wo der Variablenname zu sehen ist. Hier, x ist nur innerhalb der Funktion sichtbar foo().

Die Lebensdauer einer Variablen ist der Zeitraum, in dem sie existiert. Wenn x wurden ohne das Schlüsselwort definiert staticdie Lebensdauer wäre vom Eintritt in foo() zur Rücksendung von foo(); es würde also bei jedem Anruf auf 5 neu initialisiert werden.

Das Schlüsselwort static Maßnahmen zur Verlängerung der Lebensdauer einer Variablen auf die Lebensdauer des Programms; zB erfolgt die Initialisierung einmal und nur einmal und dann behält die Variable ihren Wert – was auch immer sie geworden ist – über alle zukünftigen Aufrufe bei foo().

  • In welchen Szenarien müssen wir eine Variable innerhalb einer Funktion als statisch deklarieren?, nur neugierig zu wissen, da ich das noch nie benutzt habe?

    – Okay

    1. August 2018 um 11:54 Uhr


  • Ich würde mich bedanken, aber das wurde alles ganz oben auf der Seite beantwortet. Es bringt mich zum Lachen, dass die Leute nicht einfach ihren eigenen Code ausführen. xD

    – Pfütze

    22. Dezember 2018 um 21:58 Uhr

  • Diese Antwort ist falsch. In dem Moment, in dem Sie an rekursive Funktionen denken, erklären die hier beschriebenen Definitionen nicht das Verhalten!

    – Philip Couling

    3. Februar 2019 um 18:17 Uhr

  • Was passiert, wenn ich eine statische Variable deklariere und dann in einer separaten Zeile wie folgt initialisiere: static int a; a = 0; In diesem Fall würde a jedes Mal auf 0 zurückgesetzt werden. Ist das korrekt?

    – Lakshya Goyal

    31. März 2020 um 6:03 Uhr


  • @LakshyaGoyal Ihre zweite Zeile ist eine Anweisung, keine Initialisierung. Also ja, da hast du recht a wäre jedes Mal Null (unmittelbar nachdem die 2. Zeile ausgeführt wurde). Dies würde natürlich wahrscheinlich die Vorteile der Verwendung einer statischen Variablen zunichte machen.

    – Tyrel Kostyk

    18. Dezember 2020 um 19:36 Uhr

Benutzeravatar von Nitesh Borad
Nitesh Borad

Ausgabe: 6 7

Grund: Statische Variable wird nur einmal initialisiert (im Gegensatz zur Auto-Variable) und eine weitere Definition der statischen Variable würde während der Laufzeit umgangen. Und wenn es nicht manuell initialisiert wird, wird es automatisch mit dem Wert 0 initialisiert. So,

void foo() {
    static int x = 5; // assigns value of 5 only once
    x++;
    printf("%d", x);
}

int main() {
    foo(); // x = 6
    foo(); // x = 7
    return 0;
}

Das ist dasselbe wie das folgende Programm:

static int x = 5;

void foo()
{
    x++;
    printf("%d", x);
}

int main()
{
     foo();
     foo();
     return 0;
}

Alles, was das Schlüsselwort static in diesem Programm tut, ist, dass es dem Compiler (im Wesentlichen) mitteilt: „Hey, ich habe hier eine Variable, auf die niemand anderes zugreifen soll, sagen Sie niemandem, dass sie existiert“.

Innerhalb einer Methode teilt das Schlüsselwort static dem Compiler dasselbe wie oben mit, aber auch: „Sagen Sie niemandem, dass dies außerhalb dieser Funktion existiert, es sollte nur innerhalb dieser Funktion zugänglich sein“.

ich hoffe das hilft

  • Nun, es ist nicht wirklich dasselbe. Es gibt immer noch das Problem des Geltungsbereichs auf X. In diesem Beispiel könnten Sie damit herumstochern und herumfummeln x hauptsächlich; es ist global. Im Originalbeispiel x war lokal für foo, nur sichtbar, während man sich innerhalb dieses Blocks befindet, was ist allgemein vorzuziehen: wenn foo zu pflegen existiert x auf vorhersehbare und sichtbare Weise, dann ist es im Allgemeinen gefährlich, andere daran stoßen zu lassen. Als weiterer Vorteil, es im Geltungsbereich zu halten foo() Es hält auch foo() tragbar.

    – Benutzer2149140

    16. Januar 2014 um 15:45 Uhr


  • @ user2149140 ‘sagen Sie niemandem, dass dies außerhalb dieser Funktion existiert, es sollte nur innerhalb dieser Funktion zugänglich sein’

    – DCShannon

    1. November 2015 um 22:09 Uhr

  • Während Sie das Problem des Bereichs aufgrund des Deklarationsorts der Variablen angesprochen haben, scheint die Beschreibung von static als Einfluss auf den Bereich und nicht auf die Lebensdauer falsch zu sein.

    – DCShannon

    1. November 2015 um 22:10 Uhr

  • @Chameleon Die Frage ist als markiert c, also wäre Ihr Beispiel in diesem Zusammenhang auf globaler Ebene illegal. (C erfordert konstante Initialisierer für Globals, C++ nicht).

    – Richard J.Ross III

    26. Dezember 2018 um 19:00 Uhr


6 7

Der Compiler sorgt dafür, dass die statische Variableninitialisierung nicht jedes Mal erfolgt, wenn die Funktion eingegeben wird

Ausgang: 6,7

Grund

Die Erklärung von x ist drinnen foo aber die x=5 Die Initialisierung erfolgt außerhalb von foo!

Was wir hier verstehen müssen, ist das

static int x = 5;

ist nicht dasselbe wie

static int x;
x = 5;

Andere Antworten haben hier die wichtigen Wörter Umfang und Lebensdauer verwendet und darauf hingewiesen, dass der Umfang von x ist ab dem Zeitpunkt seiner Deklaration in der Funktion foo bis zum Ende der Funktion foo. Zum Beispiel habe ich überprüft, indem ich die Deklaration an das Ende der Funktion verschoben habe, und das macht x undeklariert bei der x++; Aussage.

Also die static int x (Geltungsbereich) Teil der Aussage gilt tatsächlich dort, wo Sie ihn irgendwo lesen INNERHALB der Funktion und erst ab da, nicht darüber innerhalb der Funktion.

Jedoch die x = 5 (lebenslang) Teil der Aussage ist Initialisierung der Variablen und passiert AUSSEN der Funktion im Rahmen des Programmladens. Variable x wird mit einem Wert von geboren 5 wenn das Programm lädt.

Ich habe das in einem der Kommentare gelesen: “Außerdem spricht dies nicht den wirklich verwirrenden Teil an, nämlich die Tatsache, dass der Initialisierer bei nachfolgenden Aufrufen übersprungen wird.” Wird bei allen Aufrufen übersprungen. Die Initialisierung der Variablen liegt außerhalb des eigentlichen Funktionscodes.

Der Wert 5 wird theoretisch unabhängig davon gesetzt, ob foo aufgerufen wird oder nicht, obwohl ein Compiler die Funktion möglicherweise wegoptimiert, wenn Sie sie nirgendwo aufrufen. Der Wert 5 sollte in der Variablen stehen, bevor foo überhaupt aufgerufen wird.

Innen foodie Aussage static int x = 5; Es ist unwahrscheinlich, dass überhaupt Code generiert wird.

Ich habe die Adresse gefunden x verwendet, wenn ich eine Funktion setze foo in ein Programm von mir eingefügt und dann (korrekterweise) vermutet, dass dieselbe Stelle verwendet werden würde, wenn ich das Programm erneut ausführen würde. Der Teil-Screenshot unten zeigt das x hat den Wert 5 schon vor dem ersten anruf foo.

Unterbrechungspunkt vor dem ersten Aufruf von foo

Eine statische Variable innerhalb einer Funktion hat eine Lebensdauer, solange Ihr Programm läuft. Es wird nicht jedes Mal zugewiesen, wenn Ihre Funktion aufgerufen wird, und nicht zugewiesen, wenn Ihre Funktion zurückkehrt.

Benutzeravatar von Andrew White
Andreas Weiß

Lesen wir einfach die Wikipedia-Artikel über statische Variablen

Statische lokale Variablen: Variablen, die innerhalb einer Funktion als statisch deklariert sind, werden statisch zugewiesen, während sie denselben Gültigkeitsbereich wie automatische lokale Variablen haben. Daher sind alle Werte, die die Funktion während eines Aufrufs in ihre statischen lokalen Variablen schreibt, immer noch vorhanden, wenn die Funktion erneut aufgerufen wird.

  • Das ist schrecklich! “Variablen, die innerhalb einer Funktion als statisch deklariert sind, werden statisch zugewiesen” – es erklärt nichts, es sei denn, Sie wissen bereits, was es bedeutet!

    Benutzer82238

    17. Februar 2011 um 19:36 Uhr

  • @Blank: Nun, dafür dachte ich, der zweite Satz war dafür. Obwohl ich denke, dass Sie Recht haben, sollte es besser formuliert werden.

    – Andreas Weiß

    17. Februar 2011 um 19:43 Uhr

  • Außerdem spricht dies nicht den wirklich verwirrenden Teil an, nämlich die Tatsache, dass der Initialisierer bei nachfolgenden Aufrufen übersprungen wird.

    – Tom Auger

    14. November 2017 um 17:48 Uhr

  • Statisch zugewiesen bedeutet weder Stack noch Heap.

    – Chamäleon

    21. Dezember 2018 um 13:40 Uhr

1424040cookie-checkStatische Variable innerhalb einer Funktion in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy