[C] static struct initialisieren

Herakles

Profifragensteller
Moin!

Man nehme folgendes struct an:

Code:
struct toll {
    int a;
    int b[500];
    int c;
};

Das struct soll nun in einer Funktion aufgerufen werden, allerdings static sein:

Code:
static struct toll uga_aga;

Soweit kein Problem, aber ich will beim ersten Aufruf die genannte Varibale "uga_aga" initilisieren - und zwar alles auf "0". Bei einer einfachen Integer-Variable ist das kein Problem:

Code:
static int i=0;

Schon wird die Variable beim ersten Frunktionsaufruf auf "0" gesetzt und anschließend behält sie den Wert des letzten Funktionsdurchlaufes.

Wie aber kann ich ein struct, das auch noch einen größeren Speicherbereich beinhaltet, sauber auf "0" initilisieren? Ein nachgezogenes memset(3) verbietet sich natürlich, weil es bei jedem Funktionsaufruf das komplette struct wieder auf "0" setzen würde.

Wie geht sowas?

Danke für Eure kompetenten Tipps,
Herakles
 
static struct toll uga_aga = {0};

Sollte wahrscheinlich gehen. Der Trick ist, dass ausgelassene Werte automatisch mit 0 angenommen werden.

Auf einigen µC Architekturen funktioniert das aber nicht in jedem Speicherbereich. Aufpassen und überprüfen.
 
static struct toll uga_aga = {0};

Sollte wahrscheinlich gehen. Der Trick ist, dass ausgelassene Werte automatisch mit 0 angenommen werden.

Auf einigen µC Architekturen funktioniert das aber nicht in jedem Speicherbereich. Aufpassen und überprüfen.

Code:
static int i=0;

Schon wird die Variable beim ersten Frunktionsaufruf auf "0" gesetzt und anschließend behält sie den Wert des letzten Funktionsdurchlaufes.
Nein, das ist nicht was passiert. Wie globale Variablen haben statics einen festen Platz im Speicher und können deswegen von Anfang an mit einem Wert belegt werden. Also sobald der Loader das Binary lädt, nicht erst bei einem Funktionsaufruf.
 
@döna: Danke!

Ich zitiere mal aus dem geannten Artikel:

In C, statically-allocated variables without an explicit initializer are initialized to zero (for arithmetic types) or a null pointer (for pointer types).

Heißt: Ein struct, das als static definiert wird, wird automatisch auf 0, bzw. ein Pointer innerhalb eines solchen structs automatisch auf NULL initialisiert.

Das passiert im Übrigen nicht nur mit structs, sondern mit allen static Variablen, also ein

Code:
static int c;

ist automatisch auf 0 initialisiert, also ist c==0. Ein Pointer eben auf NULL, also wäre bei

Code:
static int *c;

der initialisierte Wert von c==NULL.

Danke!
 
was spraeche denn gegen ein
Code:
static int fristrun=1;
if (firstrun)
{
  memset((void*)&STRUCTNAME,0,sizeof(STRUCTNAME));
  firstrun=0;
}
?

tatsache ist dass es eigentlich unerheblich ist ob du ein static struct anlegst. oder dir den speicher dafuer z.b. mit einem malloc anlegst.
es wird einfach nur im RAM ein bereich dafuer angelegt, welcher nicht (wie beim stack) nach dem beenden der funktion wieder freigegeben wird.

und dieser bereich muss auch initialisiert werden.
dadurch dass du ein memset benutzt weisst du auch dass dafuer die schnellste moegliche methode genommen wird.
 
Zuletzt bearbeitet:
Man könnte natürlich auch bzero nehmen, da man bestimmt irgendeinen Fall konstruieren kann, in dem das noch schneller als memset ist ;) döna hat aber den wichtigsten Punkt genannt: Statische Daten landen im .bss Segment, welches vom Lader auf Null gesetzt wird. Im Gegensatz zu Stack- o. Heapdaten müssen statische Daten nicht mit Null initialisiert werden. Anders ausgedrückt: Ein explizites auf Null setzen ist redundant.

Falls man eine andere Initialisierung braucht, gibt's auch noch die Möglichkeit, die Initialisierungsfunktion als 'Konstruktor' zu deklarieren, z.B. mit attribute((__constructor)) im GCC. ;)
 
das mit dem .bss wusste ich auch noch nicht.
aber da ich immer mit exotischen platformen zu tun habe, und ich nicht weiss ob das .bss - ausnullen auch dort betrieben wird werde ich dennoch weiter memset benutzen ;)
 
Beim 8051 im XDATA (extended Memory) oder FAR Speicherbereich zum Beispiel funktioniert das Vorbelegen von Variablen grundsätzlich nicht. Deswegen wird der Speicher oft im Boot-Code vollständig genullt.
 
Zurück
Oben