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 0x01516988wenn 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)