Zeiger bei Erzeugung mit einem Wert versehen?



  • Moin, bin dabei, C zu lernen und beschäftige mich gerade mit Zeigern.

    #include <stdio.h>
    
    int main()
    {
       /* Deklaration einer Variablen und eines Zeigers */
       double preis = 1.45;
       double *preisZeiger;
    
       /* Zeiger bekommt Adresse der Variablen */
       preisZeiger = &preis;
    
       /* Ausgabe des Werts über Variable und über Zeiger */
       printf("%.2f\n", preis);
       printf("%.2f\n", *preisZeiger);
    
       return 0;
    }
    

    In dem Buch ("Einstieg in C" von Thomas Theis) wird als Einstieg dieses kleine Programm benutzt. Als Ergänzung wird der Hinweis gegeben, daß man den Inhaltsoperator "*" bei einem Zeiger nur benutzen sollte, wenn er auch auf etwas zeigt. Läßt man also

    preisZeiger = &preis;
    

    weg, kann es sein, daß das Programm abstürzt.

    Das Weglassen der Adreßzuweisung macht in diesem Fall natürlich keinen Sinn, kann man ja aber auch mal vergessen.
    Deswegen hatte ich mich gefragt, ob man nicht bei Erzeugung des Zeigers diesem einfach "0" zuweist und damit das Absturzproblem löst.
    Nach Recherche im Internet fand ich heraus, daß das wohl eine Möglichkeit ist ebenso die Zuweisung mit "NULL".

    Angeblich soll aber auch nach dem C99-Standard Zeigern automatisch "0" vom Compiler zugewiesen werden.

    Frage,
    - macht es Sinn, Zeigern eine "0" oder "NULL" zuzuweisen?
    - stimmt es, daß der Compiler das automatisch macht?



  • qwertz_2015 schrieb:

    In dem Buch ("Einstieg in C" von Thomas Theis) wird als Einstieg dieses kleine Programm benutzt. Als Ergänzung wird der Hinweis gegeben, daß man den Inhaltsoperator "*" bei einem Zeiger nur benutzen sollte, wenn er auch auf etwas zeigt. Läßt man also

    preisZeiger = &preis;
    

    weg, kann es sein, daß das Programm abstürzt.

    Inhaltsoperator? 😃 Ja, kann sein wenn er auf etwas falsches zeigt.

    qwertz_2015 schrieb:

    Das Weglassen der Adreßzuweisung macht in diesem Fall natürlich keinen Sinn, kann man ja aber auch mal vergessen.
    Deswegen hatte ich mich gefragt, ob man nicht bei Erzeugung des Zeigers diesem einfach "0" zuweist und damit das Absturzproblem löst.

    Nein, damit löst man garnichts, da die Adresse 0 auch nicht dereferenziert werden darf.

    qwertz_2015 schrieb:

    Frage,
    - macht es Sinn, Zeigern eine "0" oder "NULL" zuzuweisen?
    - stimmt es, daß der Compiler das automatisch macht?

    Ja, Sinn machen tut es, vorallem ist 0 besser als "uninitialisiert" d.h. garbage.
    Nein, der Compiler macht das nicht überall automatisch. Es ist guter Stil, sich anzugewöhnen alles mit einem Wert vorzubelegen, aber wie gesagt, das Absturzproblem ist dadurch nicht behoben, da 0 dereferenziert immernoch verboten ist.

    PS: Merk dir mal lieber "Dereferenzierungsoperator" als "Inhaltsoperator", das wirst du im Internet wohl eher finden.
    PS2: Zeigt ein Zeiger auf irgendeine ungewollte Adresse 'kann' es sein, dass das Programm abstürzt, es kann aber auch sein dass es nicht abstürzt und es dir vorkommt als würde es korrekt laufen. Ein Zeiger auf 0 wird aber beim dereferenzieren immer einen crash verursachen.



  • qwertz_2015 schrieb:

    - macht es Sinn, Zeigern eine "0" oder "NULL" zuzuweisen?

    Nein: Wenn Du bei der Definition sinnvoll initialisieren kannst, wie hier, isses viel besser.
    Schreibst ja auch nicht

    double preis = 0;
    
    double preis = 1.45;
    

Anmelden zum Antworten