Frage ZeroMemory
-
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, alsosizeof(array) = 101 * sizeof(int)
werden reserviert. Aus diesem Grund funktioniertZeroMemory(&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 gehtZeroMemory(&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 weiterhinbuf2 == &buf2[0]
ZeroMemory(&buf2[0],sizeof(buf2[100]))
geht, weil&buf2[0] == buf2
und mitsizeof(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 didstwarum 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.