Frage ZeroMemory



  • Hi. Ich leer Structs und Arrays gern mit ZeroMemory-Funktion.

    int array[101];
    //ZeroMemory(&array,sizeof(array[100])); << Falsch
    ZeroMemory(&array,sizeof(array)); // Richtig
    

    Nun habe ich mal mittels malloc ein Variable erstellt, aber das lässt mit ZeroMemory meine Anwendung crashen und ich verstehe nicht ganz wieso.

    unsigned char *buf2 = (unsigned char *)malloc(101);
    
    //ZeroMemory(&buf2,sizeof(buf2)); // Mit dieser sonst richtigen Zeile crasht es
    //ZeroMemory(&buf2,sizeof(buf2[100])); // Mit dieser Zeile crasht es ebenfalls
    ZeroMemory(&buf2[0],sizeof(buf2[100])); // So funktioniert es plötzlich
    

    Warum? Was genau ist da plötzlich der große Unterschied?



  • Keine Ahnung, was diese ZeroMemory Funktion sein soll. Was macht sie? Von welcher SDK/Bibliothek redest du?



  • Ups, das ja eine Win32 Funktion 🤡

    The ZeroMemory function fills a block of memory with zeros.

    VOID ZeroMemory(

    PVOID Destination, // address of block to fill with zeros
    DWORD Length // size, in bytes, of block to fill with zeros
    );

    Parameters

    Destination: Points to the starting address of the block of memory to fill with zeros.

    Length: Specifies the size, in bytes, of the block of memory to fill with zeros.

    Return Values: This function has no return value.

    Vielleicht ein Moderator der das Thema ins Win32 Forum schubsen kann? Thx



  • ok, ich hätte auch so antworten können ...

    Wenn du int array[101] machst, dann wird ein Int-Array mit 101 Elementen angelegt, also sizeof(array) = 101 * sizeof(int) werden reserviert. Aus diesem Grund funktioniert ZeroMemory(&array,sizeof(array)); , da du die richtige Blockgröße weitergibst.

    sizeof(array[100]) == sizeof(int) != sizeof(array) logisch, weil das 100. Element de Arrays ein int ist und definitiv ungleich als 101 int-Elemente zusammen. Aus diesem Grund geht ZeroMemory(&array,sizeof(array[100])) schief, weil ZeroMemory nur ein Teil des gesamten Blocks auf 0 setzt (nämlich die ersten 4 Bytes), der Rest bleibt unberührt. buf2 ist ein Zeiger, kein Array. I.a. gilt: sizeof(zeiger) != sizeof(array) . Auf x86 Systeme sind alle Zeiger gleich groß, nämlich 4 Bytes breit.

    So, ZeroMemory(&buf2,sizeof(buf2[100])); sollte crashen buf2 ist ein Zeiger, kein Arrays, deswegen gilt nicht &buf2 == &buf[0] . Merke, ein Zeiger ist wie eine int-Variable, die nur eine Adresse speichert, nämlich worauf er der Zeiger zeigt. Es gilt aber weiterhin buf2 == &buf2[0]

    ZeroMemory(&buf2[0],sizeof(buf2[100])) geht, weil &buf2[0] == buf2 und mit sizeof(buf2[100]) sagst du der Funktion, sie solle 4 Bytes (von den 101 reservierten Bytes) auf 0 setzen, was natürlich geht.

    So, zur malloc Anwendung:
    Thou not shall cast malloc, yet thou didst 😉



  • und nimm

    memset(...);
    

    👍



  • ZeroMemory *ist* memset...
    wird wohl so oder so ähnlich in einem windows-header zu finden sein:

    #define ZeroMemory(d, s) (void)(memset(d, 0, s))
    


  • Danke für die Erklärung!

    supertux schrieb:

    So, zur malloc Anwendung:
    Thou not shall cast malloc, yet thou didst 😉

    warum darf ich nicht malloc casten? Wie anders will ich sonst ein unsigned char* aufbauen? Compiler meckert ja sonst das void nicht unsigned char* ist.



  • Vielleicht mal nen C Compiler benutzen und keinen C++ Compiler. malloc/calloc/realloc wird nicht gecastet.



  • ~Zero schrieb:

    Compiler meckert ja sonst das void nicht unsigned char* ist.

    aber wenn du einem char* einen void* zuweist, dann meckert er nicht. warum sollte er auch?
    🙂



  • feigling schrieb:

    Vielleicht mal nen C Compiler benutzen und keinen C++ Compiler. malloc/calloc/realloc wird nicht gecastet.

    Also das klappt super und muss so, da ich keinen C-Compiler habe und die Source aus einem Uraltprojekt stammt.

    ~fricky schrieb:

    aber wenn du einem char* einen void* zuweist, dann meckert er nicht. warum sollte er auch? 🙂

    Würde ich char benötigen, dann hät ich es als Typ auch genommen, ich brauch aber unsigned char. 😉



  • ~Zero schrieb:

    feigling schrieb:

    Vielleicht mal nen C Compiler benutzen und keinen C++ Compiler. malloc/calloc/realloc wird nicht gecastet.

    Also das klappt super und muss so...

    http://www.c-plusplus.net/forum/viewtopic.php?t=206606
    ^^punkt 1.

    ~fricky schrieb:

    aber wenn du einem char* einen void* zuweist, dann meckert er nicht. warum sollte er auch? 🙂

    Würde ich char benötigen, dann hät ich es als Typ auch genommen, ich brauch aber unsigned char
    [/quote]
    ob vorzeichen oder nicht spielt keine rolle dabei. einen void pointer kann man jedem anderen pointer zuweisen, ohne zu casten.
    🙂



  • ~Zero schrieb:

    feigling schrieb:

    Vielleicht mal nen C Compiler benutzen und keinen C++ Compiler. malloc/calloc/realloc wird nicht gecastet.

    Also das klappt super und muss so, da ich keinen C-Compiler habe und die Source aus einem Uraltprojekt stammt.

    Dein C++-Compiler kann mit Sicherheit auch C kompilieren: änder mal die Datei-Endung in ".c".



  • int array[101];
    ZeroMemory(&array,bla); // ohnehin falsch
    


  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten