Was ist der Unterschied zwischen einem lokal/statisch und einem dynamisch deklarierten Struct/Struktur in C?
Ich weiß, wie man sowas deklariert, zumindest finde ich folgende Folien dafür hilfreich:
https://www.luis.uni-hannover.de/fileadmin/kurse/material/CKurs/c9_Strukturen.pdf
Was mir aber nicht klar ist, ist, wann man Structs lokal, wann statisch deklarieren sollte, also die Verwendung, und was der Zweck der jeweiligen Implementierung ist.
Liebe Grüße,
Katharina
2 Antworten
Wenn du mit statisch per static in einer Funktion meinst dann macht mans dann wenn die Variable über mehrere Funktionsaufrufe hinweg den Zustand behalten soll.
Also die Funktion
int count()
static int counter = 0;
counter++;
return counter;
Würde beim ersten Aufruf 1 und beim zweiten Aufruf 2 zurück geben.
Mit structs direkt hat das aber nichts zu tun, die sind hier wie jeder andere Datentyp zu verwenden und es gelten auch die selben Eigenschaften bezüglich Lifetime, storage location usw.
Nehmen wir an, wir haben eine Deklaration der Art
struct ABC {
int a,b,c;
};
Dann gibt es folgende Möglichkeiten:
1. Innerhalb einer Funktion definiert
struct ABC xABC;
eine Variable xABC, die beim Aufruf der Funktion erzeugt und eventuell initialisiert wird und die am Ende der Funktion verschwindet. Diese Variable ist nur innerhalb der Funktion sichtbar.
2. Innerhalb einer Funktion definiert
static struct ABC xABC;
eine statische Variable xABC, die beim Start des Programms, also vor Aufruf von main() initialisiert wird und die bis zum Ende des Programms erhalten bleibt. Diese Variable ist auch nur im Inneren der Funktion sichtbar.
3. Außerhalb einer Funktion definiert
static struct ABC xABC;
eine statische Variable xABC, die ebenfalls vor Aufruf von main() initialisiert wird. Auch ihr Inhalt bleibt während der gesamten Programmlaufzeit erhalten. Diese Variable ist im gesamten Modul (C-Quelle) sichtbar.
Das verwendet man, wenn man in einem Modul mehrere Funktionen hat und sich im Interesse der Übersichtlichkeit (oder aus Faulheit) die Parameterübergabe sparen will.
4. Außerhalb einer Funktion definiert
struct ABC xABC;
eine statische (!) Variable xABC. Sie verhält sich so, als ob sie mit static definiert wäre, ist aber global und in allen Modulen sichtbar.
Sie darf nur in genau einem Modul definiert werden, muss dann bei Bedarf von den anderen Modulen mit
extern struct ABC xABC;
importiert werden.
Das verwendet man, wenn die Struct wichtige Informationen für das ganze Programm enthält.
Alle diese Möglichkeiten definieren nur eine Struct-Variable. Wenn man mehrere braucht, holt man die sich dynamisch z.B. mit
struct ABC *pABC;
pABC = malloc(sizeof(struct ABC));
und hält die Zeiger in einer Liste.