memcpy problem



  • Ich möchte von einer Variablen ab einer bestimmten Position Speicher kopieren.

    memcpy( &recMessage, &recMessage + msglen, iRV - msglen );
    

    hierbei crasht es allerdings, im debugger seh ich auch warum kann es mir aber nicht ganz erklären.
    msglen 55
    &recMessage 0x0150f4a8
    &recMessage + msglen 0x01516988

    wenn ich aber im Taschenrechner 0x0150f4a8 + 55 (55 natürlich in Hex umwandeln) rechne, erhalte ich 0x0150F4DF
    Wieso rechnet der Debugger/Compiler mit 74E0 (0x01516988 - 0x0150f4a8)?

    danke



  • Von welchem Typ ist denn dein recMessage?

    Es gilt folgendes:
    Sei a vom Typ int* mit der Adresse 0x00.
    Dann hat a+2 die Adresse 0x00 + 2*sizeof(int), welches
    auf den meisten Systemen 0x08 wäre, und nicht 0x02!

    Ich hoffe, das erklärt hier deinen Fehler.

    Gruß mcr

    Edit: Kannst du hier mal ein Minimalbeispiel posten, welches auch
    kompiliert. Damit läßt es sich dann leichter helfen.



  • recMessage ist ein Struktur mit folgendem Aufbau

    typedef struct _MESSAGE
    {
    	char	a[4];
    	DWORD	b;
    	DWORD	c;
    	DWORD	d;
    	DWORD	e;
    	DWORD	f;		//reserved for future use (first use in debug link)
    	DWORD	g;		//reserved for future use
    	long	h;
    	BYTE	i[512];
    
    };
    

    Heißt das denn ich muss folgendes machen

    memcpy( &recMessage, &recMessage + msglen/sizeof(_MESSAGE), iRV - msglen );
    

    Danke schonmal für die Hilfe!



  • pointercrash schrieb:

    &recMessage + msglen

    das zielt *sizeof(recMessage)msglen bytes weiter.
    wenn du in bytes weiterpointern willst dann z.b so:

    ((char*)&recMessage) + msglen
    

    🙂



  • man: memmove(3) ist besser geeignet, wenn man der Kopierbereich und Zielbereich sich überlappen.



  • Danke adress-freak, das hat mein Problem gelöst.
    @supertux: Warum wenn man fragen darf?



  • memcpy erzeugt falsche Resultate, wenn die Bereiche sich überlappen. Vergleiche man: memcpy(3) und man: memmove(3)


Anmelden zum Antworten