statische Variable dynamisch zugewiesen

8

Eine statische Variable innerhalb einer Funktion wird nur einmal während der Lebensdauer des Programms zugewiesen.

Also wenn ich eine Funktion wie:

habe %Vor%

und ich rufe zuerst

an %Vor%

und dann

%Vor%

Wie groß wird das Array nach dem zweiten Aufruf sein?

    
user695652 20.11.2012, 19:31
quelle

4 Antworten

5

static lokale Variablen werden initialisiert, wenn der Kontrollfluss die Deklaration zum ersten Mal erreicht. In diesem Fall haben Sie seit der ersten Verwendung von 1 als Parameter n die Größe für ein int zugewiesen.

Solche Sachen zu machen ist eine schlechte Idee. Sie sollten nur einen lokalen, nicht statischen, std::vector oder einen anderen übergeordneten Container verwenden.

    
mfontanini 20.11.2012, 19:38
quelle
6

static Variablen local Eine Funktion wird initialisiert, wenn die Steuerung sie zum ersten Mal durchläuft. Der relevante Abschnitt in der Norm ist 6.7 [stmt.dcl]. Das heißt, das Array erhält die Größe 1 und behält diese Größe, es sei denn, Sie ändern seine Größe explizit.

Was in C ++ 2011 schön ist, ist, dass die Initialisierung der Variable static auch Thread-sicher ist: Wenn ein anderer Thread die Instanz erreicht, während die Variable initialisiert wird, wird der zweite Thread blockiert, bis die Initialisierung abgeschlossen ist.

    
Dietmar Kühl 20.11.2012 19:37
quelle
2

Die Initialisierung statischer Variablen innerhalb einer Funktion erfolgt nur während der ersten Auswertung der statischen Anweisung innerhalb der Funktion. Wenn f zum ersten Mal mit f(1) aufgerufen wird, wird die Initialisierung für a ausgeführt, und sie zeigt auf ein Array eines einzelnen int. Wenn f(3) aufgerufen wird, wurde a bereits initialisiert, also die rechte Seite von:

%Vor%

wird nicht erneut ausgewertet, und a zeigt weiterhin auf das ursprünglich zugewiesene Array der Größe 1.

    
NickR 20.11.2012 19:49
quelle
0

Das Array hat die Größe 1, da die Initialisierung der Variablen 'a' nur einmal ausgeführt wird, wenn die Funktion 'f' zum ersten Mal aufgerufen wird.

    
Liam 20.11.2012 20:02
quelle

Tags und Links