Veröffentlicht 18. Mai 200619 j Kann mir jemand mitteilen ob der folgende Quellcode richtig ist? #include <stdio.h> #include <stdlib.h> int main (void) { int n; int * heap; printf("n = "); scanf("%d", &anzahl); heap = (int*)malloc((n+1) * sizeof(int)); for (int i = 1; i <= n; i++) { *(heap+i) = i; } return 0; }[/PHP] [b]Aufgabenstellung:[/b] Ganze Zahl (n) einlesen, dynamisch einen heap aus (n+1)-Werten anlegen. Komponente [0] des zugrunde liegenden Vektors soll unberücksichtigt bleiben, sodass n Elemente im heap Speicher verbleiben. Desweiteren sollte eine Initialisierung der Komponenten des Vektors mit Ihrem laufenden Index erfolgen, sodass ein Vektor mit Zahlenwerten 0, 1, 2, ... n entsteht.
18. Mai 200619 j Die Variable anzahl ist nicht deklariert, vermutlich meinst du n. Der Cast des Rückgabewerts von malloc ist unnötig. Und statt *(heap+i) würde ich heap schreiben. Ist aber kein Fehler. Die Aufgabenstellung ist IMHO widersprüchlich, was heap[0] angeht.
18. Mai 200619 j Nein Ich sehe auf Anhieb 3 Fehler + einen in der Aufgabenstellung (wenn das erste Element ignoriert werden soll dann kann es auch nicht den Wert 0 bekommen). Die anderen Fehler sind einmal die Abbruchbedingung der Schleife, das du den Speicher nicht wieder freigibst und einer auf den dich dein Compiler aufmerksam gemacht hätte wenn du das vorher mal kompiliert hättest EDIT: das nein ist nicht auf dich bezogen Klotzkopp
18. Mai 200619 j Habe noch 2 weitere Fragen: Was ist unter dem Cast des Rückgabewerts von malloc zu verstehen => (int*)? Wieso ist die Abbruchbedingung in der Schleife falsch?
18. Mai 200619 j Oh sorry da hatte ich mich verguckt ist ok so. Hatte ein < statt nem <= gelesen. Ansonsten halt wie gesagt noch das mit der anzahl bzw. n und dieFreigabe des reservierten Speichers
18. Mai 200619 j Wie kann ich den Speicher wieder freigeben? Mit der Anweisung free(heap); funktioniert es nicht!
18. Mai 200619 j #include <stdio.h> #include <stdlib.h> int main (void) { int n; int * heap; printf("n = "); scanf("%d", &n); heap = (int*)malloc((n+1) * sizeof(int)); for (int i = 1; i <= n; i++) { heap[i] = i; } printf("vor free() \n"); for (int i = 1; i <= n; i++) { printf("Wert heap[%d]: %d \n", i, heap[i]); } free(heap); printf("\n"); printf("nach free() \n"); for (int i = 1; i <= n; i++) { printf("Wert heap[%d]: %d \n", i, heap[i]); } return 0; }[/PHP] Wieso werden dann vor und nach free(heap); die gleichen Werte ausgegeben?
18. Mai 200619 j Warum nicht? mit malloc reservierst du den Speicher vom Betriebsystem. Mit free sagst du ihm das du en Speicher nicht mehr brauchst und es ihn anderweitig verwenden kann. Die Werte bleibne da solange drin stehen bis der Speicher einem anderen Programm zugewiesen wird das ihn überschreibst oder du den PC ausschaltest.
19. Mai 200619 j Vielleicht noch ein Hinweis : nach free (heap) sollte nicht mehr auf heap zugegriffen werden, sonst kann es zu Abstürzen kommen. Der Speicher ist deinem Programm nicht mehr zugewiesen. Gruß, Kristian
20. Mai 200619 j Ist ne gute Frage, bis jetzt bin ich von dem zuerst genannten Heap ausgegangen. Die Aufgabenstellung findest du hier (Übung 4): http://www.informatik.fh-mannheim.de/%7Eepp/prp_uebung.html Was denkst du, um welchen Heap es sich handelt? PS: Die Traversierung (gewünschte Ausgabe) habe ich fast gamacht.
20. Mai 200619 j Den 2. natürlich. Das hat nichts mit dynamischem Speicher zu tun sondern mit Bäumen. Es ist ja auch die Rede von Knoten und eine Baumstruktur abgebildet.
21. Mai 200619 j Den 2. natürlich. Das hat nichts mit dynamischem Speicher zu tun sondern mit Bäumen. Es ist ja auch die Rede von Knoten und eine Baumstruktur abgebildet. Kann mir mal jemand ein praktisches Beispiel nennen, in dem sowas Anwendung findet? In Wikipedia steht ja was von einem Vorrangwarteschlangen-System, aber dort gibt es PRIO Klassen und dann eine sequentielle/parallele Reihenfolge, dies könnte man viel bequemer ohne diese HEAP Logik lösen. Von den genannten Algorithmen habe ich keine Ahnung - vllt. würde mir mal ein Beispiel helfen Danke :nett:
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.