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


Anmelden zum Antworten