Forum: Mikrocontroller und Digitale Elektronik gcc: definierte struct global vs. innerhalb der Funktion


von brechbunkt (Gast)


Lesenswert?

Hallo,

wie im nachfolgendem Beispiel habe ich ein ganz normales struct. Wenn 
ich diese Struktur wie im Beispiel innerhalb der Main definiere, 
befinden sich irgendwelche Werte (zufällig im Speicher liegend) in den 
Variablen.
Definiere ich diese Struktur jedoch global, außerhalb der Main, haben 
alle Variablen innerhalb der Struktur einen fest beschriebenen Wert mit 
Nullen.

Kann mir jemand sagen, warum das GCC hier nicht an beiden Stellen gleich 
macht?
1
typedef struct
2
{
3
  uint16_t TIM_Prescaler;
4
  uint16_t TIM_CounterMode;
5
  uint16_t TIM_Period;
6
  uint16_t TIM_ClockDivision;
7
  uint8_t TIM_RepetitionCounter;
8
} TIM_TimeBaseInitTypeDef;
9
10
void main(void)
11
{
12
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
13
  ....
14
}

von Cyblord -. (cyblord)


Lesenswert?

Globale Variablen werden halt mit 0 initalisiert und lokale, d.h. 
Variablen auf dem Stack nicht.

Die globalen können 1 mal beim Start initalisiert werden, bei lokalen 
muss es jedes mal beim definieren der Variable passieren. Bei jedem 
Funktionsaufruf wieder. Wär doch ein übler overhead.

gruß cyblord

von Dr. Sommer (Gast)


Lesenswert?

Deswegen gibts ja auch C++ mit Konstruktoren, die dafür sorgen dass alle 
Element von Klassen ("super-structs") immer gültig initialisiert sind. 
In diesem Fall der ST StdPeriphal Library gibts aber sowas ähnliches:
1
TIM_TimeBaseInitTypeDef init;
2
TIM_TimeBaseStructInit (&init);
 initialisiert alle Felder der Struktur auf Standard-Werte

von Konrad S. (maybee)


Lesenswert?

brechbunkt schrieb:
> Kann mir jemand sagen, warum das GCC hier nicht an beiden Stellen gleich
> macht?

Er macht es in beiden Fällen gleich: Er hält sich an die 
Spezifikationen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.