013
22.01.2005, 23:31 Uhr
Hans
Library Walker (Operator)
|
Hi,
es könnte sein, das ich jetzt Unsinn schreibe, weil ich nicht so genau geguckt habe, aber mir scheinen folgende Probleme aufgefallen zu sein (meine Güte, das klingt irgendwie geschwollen...) Zum einen musst Du ja für jede Adresse, die Du anlegst, Speicher reservieren, weil Du ja mit einer verketteten Liste arbeitest, wenn ich das richtig sehe. Wenn Du für jede Adresse separat Speicher reservierst, musst Du den Speicher auch für jede Adresse separat wieder freigeben. Zum einen, weil die Speicherbereiche sehr wahrscheinlich nicht hintereinander liegen, zum anderen, weil free() nur den Speicherblock wieder frei gibt, den ein vorheriger Aufruf von malloc() reserviert hat. Ach ja, und eine Datei, die man geöffnet hat, sollte man auch wieder schliessen. (Es könnte zwar sein, das Du das in Deiner Aussage impliziert hast, aber weil es da nicht steht... )
Zitat: |
Wenn ich aber das DOS-Fenster nicht schließe und eine Datei öffne, habe ich alle Adressen doppelt. Da ja alle Adressen noch im Arbeitsspeicher sind und dann nocheinmal die gleichen Adressen aus der Datei kommen.
|
Das stimmt so nicht. Das scheint zwar so zu sein, muss aber nicht auf alle Speicherbereiche zutreffen.
Zitat: |
Deswegen möchte ich selber den Arbeitsspeicher leeren, damit die Adressen nicht doppelt vorkommen.
|
Die saubere Lösung ist in diesem Fall, das Du den Speicher initialisierst, bevor Du ihn benutzt. Das heisst, wenn Du den Zeiger hast, den malloc() Dir übergeben hat, dann ist die erste Aktion, die Du durchfürst die, das Du alle Felder der Struktur mit Nullen (oder Leerzeichen) füllst, bevor Du irgend was anderes da rein schreibst.
Hans -- Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung. Dieser Post wurde am 22.01.2005 um 23:32 Uhr von Hans editiert. |