PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Deklaration/Definition



anfängerrr
25.11.2004, 19:46
Hallo,

mal ne ganz dumme Frage:
Was ist der Unterschied zwischen Deklaration und Definition einer Variablen?
Warum können Variablen nicht bei ihrer Deklaration initialisiert werden???
Irgendwie habe ich den Überblick verloren und hoffe auf eindeutige Erklärung.
Danke

25.11.2004, 21:05
Deklaration:

unsigned char i;

Definition/Initialisierung:

i = 0;

Man kann auch beides mit einmal machen, kommt halt immer drauf an:

unsigned char i = 0;

Wenn du in einer Header-Datei eine Variable global anlegst, dann darfst du sie dort nur deklarieren. Initialisiert wird sie in der zugehörigen C-Datei.
Arbeitest du mit einer Variable lokal in einer Funktion o.ä., dann dürfen beide Schritte mit einem mal ausgeführt werden.

Alle Klarheiten beseitigt? :-)

andreas-clausen
30.11.2004, 10:45
Noch eine kleine Ergänzung:
Die Deklaration macht dem Linker nur den Typ einer Variable bekannt. Die Definition sagt dem Compiler, wieviel Speicherplatz reserviert werden muss.
Eine reine Deklaration wäre 'extern int i;' in einer Datei 'a.c'. Es wird hier kein Speicherplatz fuer i reserviert. Der Linker wird mit dieser Deklaration lediglich beauftragt, nach einer Datei zu suchen, in der die Definition 'int i' steht. In der Datei 'b.c' könnte dann 'int i;' stehen. Hier würde der Linker fündig. Mit 'int i' wird der Compiler beauftragt, tatsächlich die 4B für Integer auf einem 32-Bit-System zu besorgen. Es darf unter den gelinkten Dateien aber nur eine geben, die mit 'int i' i global definiert! Ein lokales normales 'int i;' ist immer eine Deklaration und Definition zugleich.
Die Initialisierung ist die erste Zuweisung einer Variablen. Bei globalen Variablen (die also im Speicherbereich heap abgelegt werden und die ganze Laufzeit des Programms erhalten bleiben) findet in C eine automatische Initialisierung mit dem Wert 0 statt, bei lokalen wird zwar Speicherplatz reserviert, aber dessen Inhalt ist nicht vom ANSI-C-Standard vorgeschrieben.
Genauer steht´s im ANSI-C-Standard oder bei Kernighan&Ritchie "Programmieren in C".
Nach bestem Wissen und Gewissen und mit Gruß
Andreas.

P.S.: Dynamisch allozierte Variablen (also z.B. mit malloc() besorgter Speicherplatz) werden zwar auf dem Heap abgelegt, und sind damit definiert, aber noch nicht initialisiert.