char szPath[MAX_PATH+1] = {0} und memset(szPAth,0,MAX_PATH); Wo ist de Unterschied?



  • Hallole mal wieder.

    Der Titel sagt schon alles.

    Ich habe in einem Code beispiel von Microsoft diese Zeile gefunden:

    char szPath[MAX_PATH+1] = {0}
    

    Es wird also eine Variable Namens szPath mit 261 Zeichen (MAX_PATH=260) deklariert.
    Dann wird diese Variable mit {0} initialisiert.

    ICh habe das so bisher noch nie gesehen und habe bisher immer

    memset(szPath,0,MAX_PATH)
    

    angewendet.

    Doch wo ist da der Unterschied?
    Ist das Beispiel von MS dasselbe oder was anderes?
    Und warum steht die 0 in Klammern?

    Danke schonmal Mondmann



  • Du definierst hier ein Array von Zeichen. Arrays kann man in C(++) mit einer Liste von Elementen initialisieren. Diese Liste wird in geschweifte Klammern eingeschlossen, deshalb die Klammern 😉

    Grundsätzlich gilt: Wenn ein Initialisierer angegeben ist, werden alle überschüssigen Elemente default-initialisiert (d.h. mit 0). In C++ dürfte man sogar alle Elemente auslassen, um eine vollständige Default-Initialisierung zu erreichen. Beispiel:

    char a1[10] = { 'h', 'i' }; // Im Array steht jetzt "hi\0\0\0\0\0\0\0\0"
    char a2[10] = {}; // Im Array stehen nur Nullen
    char a3[10]; // Im Array stehen zufällige Werte, wenn dies ein automatisches Array ist
    

    Ältere Compiler könnten diese Regel allerdings missachten.

    Fazit: Bei ausreichend aktuellem Compiler wäre

    char array[length] = {};
    

    vom Ergebnis her identisch zu

    char array[length];
    memset(array, 0, length);
    


  • EDIT: Hat sich erledigt.



  • Vielen Dank für die Aufklärung!

    An sowas habe ich noch gar nicht gedacht:-)
    Dann kann ich mir also in Zukunft das memset sparen und ={0} schreiben?

    Das bedeutet also konkret:
    Mit dem einen Zeichen {0} initialisiere ich das ERSTE Zeichen und C++ setzt automatisch die restlichen auf \0. Sonst müsste ich ja lt.obigem Beispiel ={0,0,0,0.....bis 261} also 261x 0 schreiben.

    Habe ich das so richtig verstanden?



  • Es wird mit so vielen Zeichen initialisiert wie angegeben sind. Fehlende Zeichen werden durch per Standardkonstruktor (oder 0 bei PODs) ergänzt.



  • Alles klar.
    Vielen Dank allen.

    Mondmann


Anmelden zum Antworten