ZeroMemory: Array mit 0 füllen?
-
Hi!
Weil ich gerade ein paar Probleme damit habe:
Kann ich ein Array mittels ZeroMemory() mit \0 füllen, oder ist die Funktion ausschließlich für Speicherbereiche gedacht?
Ich wollte ein Array, in das mehrfach ein neuer Pfad geschrieben wird, möglichst einfach mit Nullen füllen.
Wenn ich die Funktion verwende, stürzt das Programm jedoch ab...
Wird da evtl. mehr gelöscht? Ich dachte ein String ist normalerweise ein char-Array mit \0-Terminierung...
MfG
Matg40
-
Kommt darauf an, was du unter string verstehst. Wenn es std::string ist, dann kannst du dir dein ZeroMemory gleich sparen, denn std::string kümmerst sich um eine passende Initialisierung.
Wenn dein string aber wirklich ein char-Array (und nicht ein Zeiger auf einen schreibgeschützten string) ist, dann kannst du ZeroMemory durchaus verwenden um den Speicher mit einer entsprechenden Menge '\0' zu initialisieren. Da du aber von einem Absturz sprichst ist dies vermutlich nicht der Fall oder du hast ZeroMemory falsch angewendet.
-
Hi!
Ja, ich hatte einen falschen Zeiger... Sorry!

Ich hatte sogar schon eine kleine Funktion implementiert, die auch funktionierten:
int deleteArray(char* targetname) { int length = strlen(targetname); for( int i=0; i< length; i++) { if(targetname[i] == '\0') { break; } targetname[i] = '\0'; } return 0; }MfG
Matg40
-
gibts dafuer nicht das "SecureZeromemory"
-
Um ein char-Array (für einen String) leer zu machen reicht eigentlich auch targetname[0] = '\0'; strlen gibt dann 0 zurück. Ansonsten schau dir mal memset an.
-
War ZeroMemory nicht sogar nur ein Makro, das zu memset(foo, length_of_foo, 0) erweitert wird?
-
Hi!
Kann es sein, dass free() ein Problem mit ZeroMemory() hat?
Es kommt nach der Programmausführung der Fehler:
Debug Error!
Program....
DAMAGE: after Normal block (#84) at 0x004b...
Evtl. wird auf \0 gesetzter Speicher schon freigegeben?
MfG
Matg40
-
Zeig doch einfach mal deinen Code. Irgendwo hast du da offenbar einen buffer-overflow oder ähnliches drin. ZeroMemory hat ansich gar keine Probleme, sofern es denn richtig angewendet wird.
-
Hi!
Also das beteffende Codestück ist:
// Kommandozeilenparameter von Unicode in ASCII umwandeln char mbstr_outDir[MAX_PATH]; wcstombs( mbstr_outDir, ((wchar_t*)argv[3]), MAX_PATH ); // Array anlegen char* targetname = (char *)malloc( MAX_PATH ); // Pfad einfügen int targetnamelength = strlen(targetname); sprintf( targetname, mbstr_outDir); // Dateiname anhängen int filelength = strlen("\\install.reg"); strncat( targetname, "\\install.reg", filelength); // Array weiter verarbeiten copyFile("install.reg", targetname); // Wiederholt sich mehrmals... // Wieder freigeben if (targetname) { free(targetname); }Wobei das leeren des Arrays hier nicht mehr unbedingt nötig ist, da mit sprintf() eh alles überschrieben wird (aber prinzipiell)...
MfG
Matg40
-
Aber prinzipiell solltest du mal die Längen deiner Strings prüfen. Du schreibst hier munter in irgendwelche Puffer ohne zu wissen, wie lang die Zeichenketten sind und offenbar ist wohl auch einer dabei, der zu lang wird.
(Davon, dass der Code wohl auch noch für Format-String-Angriffe anfällig ist, will ich besser mal nicht weiter reden.)
-
Ich habe irgendwie das Gefühl, dass die Frage eher in das Ansi-C Forum gehört.
-
Hi!
Es sturzt nicht ab, wenn ich kein '\0' in den allokierten Speicher schreibe (wird der danach dann automatisch freigegeben?).
Sobald ich den allokierten Speicher vor seinem eigentlichen Ende terminiere, kommt die DAMAGE-Meldung...
MfG
Matg40