Playa187 Geschrieben 18. Mai 2006 Geschrieben 18. Mai 2006 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. Zitieren
Klotzkopp Geschrieben 18. Mai 2006 Geschrieben 18. Mai 2006 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. Zitieren
Guybrush Threepwood Geschrieben 18. Mai 2006 Geschrieben 18. Mai 2006 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 Zitieren
Playa187 Geschrieben 18. Mai 2006 Autor Geschrieben 18. Mai 2006 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? Zitieren
Guybrush Threepwood Geschrieben 18. Mai 2006 Geschrieben 18. Mai 2006 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 Zitieren
Playa187 Geschrieben 18. Mai 2006 Autor Geschrieben 18. Mai 2006 Wie kann ich den Speicher wieder freigeben? Mit der Anweisung free(heap); funktioniert es nicht! Zitieren
Playa187 Geschrieben 18. Mai 2006 Autor Geschrieben 18. Mai 2006 #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? Zitieren
Guybrush Threepwood Geschrieben 18. Mai 2006 Geschrieben 18. Mai 2006 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. Zitieren
Kratzy974 Geschrieben 19. Mai 2006 Geschrieben 19. Mai 2006 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 Zitieren
Playa187 Geschrieben 19. Mai 2006 Autor Geschrieben 19. Mai 2006 Kann mir jemand bei der Traversierung des heaps (Infix-Notation) helfen? Zitieren
Klotzkopp Geschrieben 19. Mai 2006 Geschrieben 19. Mai 2006 Kann es sein, dass du diesen und diesen Heap durcheinanderbringst? Zitieren
Playa187 Geschrieben 20. Mai 2006 Autor Geschrieben 20. Mai 2006 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. Zitieren
Guybrush Threepwood Geschrieben 20. Mai 2006 Geschrieben 20. Mai 2006 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. Zitieren
sayso Geschrieben 21. Mai 2006 Geschrieben 21. Mai 2006 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: Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.