Was ist der Unterschied zwischen einem lokal/statisch und einem dynamisch deklarierten Struct/Struktur in C?

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.