Archiv verlassen und diese Seite im Standarddesign anzeigen : malloc unter win32 anders?
TheDodger
13-08-2003, 14:08
Mahlzeit ...
Bei dem Wetter so ein Streß hat keiner verdient ... :(
Ich habe ein Problem, bei malloc.
Ich brauche eine portable Klasse, die mir einen Hash über eine Datei erzeugt.
Dazu habe ich eine Ableitung des sha1 gefunden uns soweit in C++ verpackt, das sie problemlos funktioniert.
(Ich häng sie gerne dran, wenn das jemand haben möchte ; )
Wenn ich Das rogramm unter Windows starte, bekomme ich allerdings einen komplett andere Hash heraus, als unter Linux. Nach ewig müßigen suchen und debuggen hab ich den "Übeltäter" ausfindig gemacht:
unsigned int* hashval = 0;
hashval = (unsigned int*)malloc( 5 * sizeof(int) );
Unter Linux steht in hashval eine '134524640' drin
und unter Windows '9341128' ...
:confused:
Huh?Du machst doch nichts anderes als 5 * sizeof(int) Speicher anzufordern.
Der Speicher ist uninitialisiert,da kann als mögliche drinstehen,und die Adresse auf die der Zeiger zeigt ist auch immer eine andere.
Btw. wenn du C++ schreibst,warum nicht new statt malloc?
einen pointer intialisiert man normalerweise mit NULL!
Original geschrieben von Silver
einen pointer intialisiert man normalerweise mit NULL!
Er hat doch geschrieben,das er C++ schreibt,also ist 0 völlig korrekt.
Außerdem is' es egal.
Wenn malloc erfolgreich war,zeigt der Pointer auf einen gültigen Speicherbereich,ansonsten gibt malloc NULL zurück.
Also,who cares :).
TheDodger
13-08-2003, 14:35
Also, das scheint es nicht gewesen zu sein ...
Hier liegt der Hase:
int BHash::m_hash( FILE* fd, unsigned int* hashval ) {
char buffer[64];
unsigned int c = 1, i = 0, length = 0;
int counter = 0;
m_BHashInit( hashval );
while( !feof( fd ) && !ferror( fd ) ) {
c = fread( &buffer, 1, 64, fd );
length += c;
if( feof( fd ) || ferror( fd ) ) {
for( i = c ; i < 61 ; i++ ) {
if( i == c ) {
buffer[i] = 0x10;
} else
if( i == 60 ) {
( (int*)buffer )[15] = length * 8;
} else {
buffer[i] = 0;
}
}
}
m_BHashHash( (unsigned int*)&buffer, hashval );
}
return( length );
}
Unter Linux lüppt's und unter Windows bricht die interne for Schleife nach 4 Durchläufen ohne Fehler ab.
Also erstmal die Standardfrage :).
Datei binär geöffnet?
Dann noch zwei Kleinigkeiten:
c = fread( &buffer, 1, 64, fd );
....
m_BHashHash( (unsigned int*)&buffer, hashval );
Das & vor buffer ist falsch,weg damit (wird aber mit deinem Problem nichts zu tun haben).
TheDodger
13-08-2003, 14:42
Original geschrieben von wraith
Er hat doch geschrieben,das er C++ schreibt,also ist 0 völlig korrekt.
Außerdem is' es egal.
Ich kaspsle nur die C Funktionen in eine C++ Klasse ... :)
TheDodger
13-08-2003, 14:48
Original geschrieben von wraith
Also erstmal die Standardfrage :).
Datei binär geöffnet?
FILE* fd;
fd = fopen( file, "r" );
Ich denke nein .... lt. man Page ist
r Open text file for reading. The stream is positioned at the beginning of the file.
Dann noch zwei Kleinigkeiten:
c = fread( &buffer, 1, 64, fd );
....
m_BHashHash( (unsigned int*)&buffer, hashval );
Das & vor buffer ist falsch,weg damit (wird aber mit deinem Problem nichts zu tun haben).
Ist der original Code gewesen ... :)
Dann öffne mal binär,mit "rb".
Unter Linux ist es egal,da gibt es keine Unterscheidung text <=> binär,und das b wird somit auch nicht weiter beachtet.
Unter Windows ist das b aber nötig,wenn du binär Dateien bearbeitest.
Original geschrieben von TheDodger
Ist der original Code gewesen ... :)
Woher?
TheDodger
13-08-2003, 15:02
Original geschrieben von wraith
Dann öffne mal binär,mit "rb".
Unter Linux ist es egal,da gibt es keine Unterscheidung text <=> binär,und das b wird somit auch nicht weiter beachtet.
Unter Windows ist das b aber nötig,wenn du binär Dateien bearbeitest.
Geanu das war's!
Danke dir!
Woher?
Uhhh ... k.A. ... ist schon Ewigkeiten her, das ich das mal gefunden hab.
Vom originalcode ist sowieso kaum noch was übergeblieben.
Aber ich versuch mal die Quelle zu ermitteln ...
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.