Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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.

Geschrieben

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

Geschrieben

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

Geschrieben

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.

Geschrieben

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

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...