Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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.

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 :)

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?

Wie kann ich den Speicher wieder freigeben? Mit der Anweisung

free(heap);

funktioniert es nicht!

#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?

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.

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

Kann mir jemand bei der Traversierung des heaps (Infix-Notation) helfen?

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.

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.