wieso memset über struct



  • Hi, ich habe gerade wieder einen etwas äteren Code ausgegraben, den ich früher einmal per copy & paste "geschrieben" hatte. Nun bin ich aber dabei, das nachzuvollziehen was da direkt gemacht wird und eine Sache verstehe ich nicht. Ich habe das snippet zum präperieren des sockaddr_in structes:

    struct sockaddr_in host_addr;
        memset( &host_addr, 0, sizeof (host_addr));
        host_addr.sin_family = AF_INET;
        host_addr.sin_port = htons (port);
        host_addr.sin_addr.s_addr = inet_addr (server);
    

    Ich frage mich nun, wozu das ganze struct mit nullen überschreibt. Ich dachte mir zuerst, um keine undefinierten Werte zu haben. Stimmt das? Und wird dabei nicht auch die Struktur von sockaddr_in zerstört?

    Wäre für Aufklärung dankbar 👍



  • MaxDemian schrieb:

    Ich frage mich nun, wozu das ganze struct mit nullen überschreibt. Ich dachte mir zuerst, um keine undefinierten Werte zu haben. Stimmt das? Und wird dabei nicht auch die Struktur von sockaddr_in zerstört?

    Wird mit 0 überschrieben, um nicht zufällig undefinierte Werte zu erhalten. Wieso sollte die Struktur dabei "zerstört" werden, wobei ich mir keine sinnvolle Bedeutung des Wortes "Zerstört" in dem Zusammenhang finden konnte 😃 . Naja, jedenfalls initialisiert du die Struktur doch erst danach mit Werten. Was soll davor also zerstört werden?



  • Hmm, ich glaube ich habe mir die Speicherung von Strukturen und Objekten falsch vorgestellt. Ich dachte, die eigentliche Struktur wird auch mit in dem alloziierten Speicher gespeichert, aber nach deiner Erklärung schätz ich mal, die liegt irgendwo anderst vor und der Compiler schaut dann, wenn er zum Beispiel die dritte Variable haben möchte, wieviel Platz seine Vorgänger brauchten und addiert den Platz zu dem Pointer auf die Struktur/Klasse.

    Ist das so einigermaßen richtig?



  • MaxDemian schrieb:

    Hmm, ich glaube ich habe mir die Speicherung von Strukturen und Objekten falsch vorgestellt. Ich dachte, die eigentliche Struktur wird auch mit in dem alloziierten Speicher gespeichert, aber nach deiner Erklärung schätz ich mal, die liegt irgendwo anderst vor und der Compiler schaut dann, wenn er zum Beispiel die dritte Variable haben möchte, wieviel Platz seine Vorgänger brauchten und addiert den Platz zu dem Pointer auf die Struktur/Klasse.

    Ist das so einigermaßen richtig?

    Ja. Der eigentlich Speicher, den über den Pointer bekommst, sind dann die Variablen, also wirklich die Inhalte.

    mfg.



  • Das memset ist in deinem Fall sinnlos. Du füllst ja sowieso danach die ganze Struktur mit sinnvollen Werten.



  • ........... schrieb:

    Das memset ist in deinem Fall sinnlos. Du füllst ja sowieso danach die ganze Struktur mit sinnvollen Werten.

    Imho wird eben gerade nicht die ganze Struktur gefüllt. Also ist memset auch net sinnlos.



  • Nun, wenn ich in C++ eine Struktur schreibe, dann hat das Biest bei mir auch einen Konstruktor welcher sich um "alles" kümmert.
    In C würde ich allerdings immer mit memset drübergehen - dann kann ich erst wirklich sicher sein.

    Deine Struktur wird dadurch natürlich nicht zerstört, sondern der zugehörige Speicher wird eben komplett mit 0en zugeschrieben.
    Für den PC ist das immer nur roher Speicher - erst du interpretierst den Speicherinhalt einmal als std::string oder als int oder oder oder.



  • bluecode schrieb:

    ........... schrieb:

    Das memset ist in deinem Fall sinnlos. Du füllst ja sowieso danach die ganze Struktur mit sinnvollen Werten.

    Imho wird eben gerade nicht die ganze Struktur gefüllt. Also ist memset auch net sinnlos.

    Nur sin_zero hat er nicht gefüllt in seinem Code. Das muss man soweit ich weiß auch nicht. Das ist nur als Padding.


Anmelden zum Antworten