C Generelle Frage vom vorinitialisieren von Variablen

Status
Für weitere Antworten geschlossen.

elektro2

Cadet 4th Year
Registriert
Feb. 2014
Beiträge
67
Hallo liebes Forum,

ich habe hier jetzt schon mehrmals eins " hinter den Löffel bekommen(:))" , weil ich Variablen nicht vordeklariere.

Ich verstehe nur nicht, was damit gemeint ist. Muss ich für jedes, z.b char c, was ich z.b in einer schleife mit c=getchar() verwende speicher allokieren, sprich char *c=(char*)malloc(sizeof(char)); wie in dem folgenden Beispiel?
Ist es sonst generell falsch??

ich frage nur, weil ich Euch nicht weiterhin Ärger machen möchte :).

Danke im Voraus für Antworten!

Code:
#include <stdio.h>

int main(void)
{
  
    FILE *f=fopen("testest.txt", "a");
    if ( f==NULL)
        printf("Fehler beim auslesen ");
    
    char *c=(char *) malloc(sizeof(char));
    
    printf("Eingeben \n");
    
    
    do{
        
        *c=getchar();
        putc(*c,f);
        
        
        
        
    }while(*c!='\n');
    
    return 0;
}
 
Damit ist gemeint, daß es von Vorteil ist, einer Variablen bei ihrer Definition auch gleich einen Initialwert zu geben. Vergißt man das, ist der Wert der Variablen (bis zum Zeitpunkt ihrer ersten Wertzuweisung) einfach undefiniert; sprich, da kann sonst was drinstehen.
 
Du bringst im Threadtitel und in deiner Frage gleich drei Dinge durcheinander, nämlich:
- Variablen initialisieren
- Variablen deklarieren
- Speicher dynamisch allokieren

Ohne die verwendeten Variablen zu deklarieren würde dein Code gar nicht erst compilieren. Eine Deklaration ist z.B. so was hier:
Code:
char c;
oder auch so was:
Code:
char *c;
Im ersten Fall deklarierst du die Variable c als Variable vom Typ char, im zweiten Fall als Variable vom Typ char*, also als Pointer auf eine Variable vom Typ char. Eine Variable zu initialisieren bedeutet demgegenüber, ihr sogleich nach der Deklaration einen Startwert zuzuweisen, z.B.
Code:
char c = 'a';
oder
Code:
char *c = NULL;
Dynamisch Speicher zu allokieren schließlich bedeutet, dass du z.B. nicht eine Variable vom Typ char automatisch erzeugen lässt, wie bei der Konstruktion
Code:
char c;
bei der die Variable auch automatisch wieder gelöscht wird, sobald der Scope verlassen wird, in dem die Variable deklariert wurde, sondern stattdessen einen Speicherbereich der Größe sizeof(char) (also 1 Byte) dynamisch anlegst, sei es per
Code:
char *c = (char *) malloc(sizeof(char));
oder per
Code:
char *c;
c = (char *) malloc(sizeof(char));
die du dann nachher manuell mit free() wieder freigeben musst. In der ersten der beiden Konstruktionen ist es außerdem so, dass du zugleich mit der Allokation die Variable c, also einen Pointer, initialisierst, nämlich mit der Speicheradresse des mit malloc dynamisch erzeugten Speicherbereichs. Dass aber Initialisierung und dynamische Allokation ansonsten nichts miteinander zu tun haben, kannst du dir an der zweiten Konstruktion klarmachen: der Pointer c wird da zunächst nicht initialisiert, er später wird ihm ein Wert zugewiesen, nämlich die Speicheradresse des dynamisch erzeugten Speicherbereichs.

Was deinen Code angeht, so kannst du auch einfach statt mit einem Pointer und dynamischer Speicherallokation mit einer automatisch erzeugten Variable arbeiten:
Code:
char c = '\0'; 
printf("Eingeben \n");
do{
    c=getchar();
    putc(c,f);
}while(c!='\n');
wobei hier die Variable c mit dem Wert '\0' initialisiert wurde. In deiner Konstruktion wird übrigens zwar der Pointer c initialisiert, nicht aber der allokierte Speicherbereich selbst.
 
Danke für deine Antwort. Sehr hilfreich :) und ausführlich
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben