Klausurlösungen sammeln

Moderator: Moderatoren

old
Beiträge: 186
Registriert: Do 17. Dez 2009, 11:50

Re: Klausurlösungen sammeln

Beitrag von old » Mi 10. Mär 2010, 20:33

Static Storage ist das, was man global deklariert.

Alles was in Funktionsaufrufen oder Funktionen definiert wird landet auf dem Stack.

Per malloc erzeugte Objekte landen auf dem Heap bzw. man weißt einem zeiger über malloc eine Adresse zu, an die er etwas schreiben darf...

Manuelito
Administrator
Beiträge: 157
Registriert: Mi 3. Mär 2010, 15:11

Re: Klausurlösungen sammeln

Beitrag von Manuelito » Mi 10. Mär 2010, 21:15

Hi old,

ne, das ist so nicht richtig, auch die Variablen, die man am Anfang von Funktionen deklariert, landen auf dem static storage. Auf dem Stack landen nur die Funktionsaufrufe selber.
Würdest du diese lokalen Variablen auch auf dem Stack ablegen, könntest du ja immer nur auf die zuletzt deklarierte Variable zugreifen; nur da du in einer Funktion meistens mehr als eine Variable benötigst, wäre das nicht das gelbe vom Ei.

Aber dass per malloc erzeugte Objekte auf dem Heap landen, ist richtig. Auf sie wird per Zeiger (der kann jetzt im Static Storage (z.B. die Hilfszeiger, die man sich in manchen Funktionen deklariert) oder im Heap (z.B. bei Listen die next-Zeiger) liegen) zugegriffen.

Viele Grüße,
Manuel

elly
Beiträge: 263
Registriert: Fr 20. Mär 2009, 02:15

Re: Klausurlösungen sammeln

Beitrag von elly » Mi 10. Mär 2010, 21:26

manuelitos erklärung erscheint durchaus richtig, kann sich dann aber jemand die diskrepanz mit großübung 8 aus dem l2p erklären?
da wird eindeutig gesagt schon auf den ersten folien in den gedankenblasen:
"lokale variablen landen auf dem stack"

elly
Beiträge: 263
Registriert: Fr 20. Mär 2009, 02:15

Re: Klausurlösungen sammeln

Beitrag von elly » Mi 10. Mär 2010, 21:27

vielleicht wird in diesem falle der stack quasi zweckentfremdet und nicht mehr per push und pop angesprochen ,sondern per eindeutiger addressierung wie man es auf den folien sieht?

old
Beiträge: 186
Registriert: Do 17. Dez 2009, 11:50

Re: Klausurlösungen sammeln

Beitrag von old » Mi 10. Mär 2010, 21:41

Also nochmal!

In der klausur war nach statischem und dynamischen speicher gefragt.

In der Informatik Übung 10 sollte man speicherdiagramme zeichen.

Dort wude EINDEUTIG Globales als static storage bezeichnet.

Per malloc erstellter speicher mit "heap".

Alles andere (Variablen in Funktionen, Funktionsparameter bei übergabe..) Werden auf den stack gelegt!
Nach einem Funktionsaufruf werden diese natürlich wieder gelöscht.

Das macht gerade den unterschied zu static aus!

elly
Beiträge: 263
Registriert: Fr 20. Mär 2009, 02:15

Re: Klausurlösungen sammeln

Beitrag von elly » Mi 10. Mär 2010, 21:46

ich bin ja auch der ansicht dass du recht hast, aber es gibt da schon dieses problem mit dem nur an die zuletzt deklarierte variable zu kommen...

old
Beiträge: 186
Registriert: Do 17. Dez 2009, 11:50

Re: Klausurlösungen sammeln

Beitrag von old » Mi 10. Mär 2010, 21:54

Hi,

also stell dir nicht vor, was C "intern" verwurstet!

Schau dir mal großübung nr. 8 ganz genau an!
Ich habe das gerade auch getan...
Da wird ganz eindeutig beschrieben, wo was landet.

Und Global deklarierte variablen (oder jene, die ein static davor haben), landen auf dem "static storage". (Das ist aber nix anderes als der stack)

Variablen, die du in funktionen anlegst landen auf dem stack.
Variablen die du als übergabeparameter übergibst landen auch auf dem stack.
(werden nach ablauf der funktion jedoch gelöscht).

Manuelito
Administrator
Beiträge: 157
Registriert: Mi 3. Mär 2010, 15:11

Re: Klausurlösungen sammeln

Beitrag von Manuelito » Mi 10. Mär 2010, 22:22

Hi,

Ich hab mir die Großgruppe Nr. 8 gerade auch mal angeguckt, demnach ist es tatsächlich so.

Wenn man jetzt jedoch in die Klausur WS07/08 B Aufgabe 3 guckt, ist es wieder andersrum... (Meine Lösungen (mit den Aufgaben) davon hab ich hier auf der 1. Seite im letzten Post verlinkt, für die, die gerade die Datei nicht zur Hand haben) Dort werden in der main ein paar Variablen deklariert, die laut der Großübung auf dem Stack landen müssten. Es wird jedoch bei der (b) gefragt, welche im statischen und welche im dynamischen Speicherbereich landen, hier ist von Stack überhaupt keine Rede. Die scheinen es also selbst nicht so genau zu wissen.

Sehr gut, dass das Skript dieses Thema so überaus ausführlich behandelt..........

Vllt. wär es am Besten, wenn einer mal im L²P die Frage stellt, in der Hoffnung, dass Herr Theiss morgen noch reinguckt. Oder vllt. direkt eine E-Mail an ihn oder den Prof schreibt...

Verwirrte Grüße,
Manuel

old
Beiträge: 186
Registriert: Do 17. Dez 2009, 11:50

Re: Klausurlösungen sammeln

Beitrag von old » Do 11. Mär 2010, 07:38

Hi,

nein!
Das ist beides richtig.

Wie folgt:
Wenn du nur nach dynamischem und "statischem" fragst ist die lösung korrekt.

Wenn du aber, wie in kgü 10, die "drei" speichertypen behandeln sollst, muss du es ebend strikt trennen.

Im Grunde ist aber alles, was du in "static storage" hast auch auf dem stack.
Nur wird es nach einem Funktionsaufruf nicht gelöscht.

Genau deshalb haben die in kg10 das Beispiel gebracht...
Du Übergibst an die Funktion Übergabewerte (eine Partei). Von Mitgliederanzahl und stimmen wird auf dem stack beim funktionsaufruf eine echte kopie erstellt.
Dann besorgst du dir per malloc speicher auf dem heap und kopierst die "daten" hinein.
Danach gibst du den zeiger auf den heap zurueck.

Nach diesem Schritt wird aber ALLES gelöscht. Der zeiger auf den namen, die mitlglieder, die stimmen. Selbstverständlich wird dann auch der speicher für den zeiger gelöscht, den du angelegt hast. (Was aber nicht schlimm ist, weil man den ja als wiedergabewert zueueckgibt).

BuzzDee
Beiträge: 20
Registriert: Di 23. Feb 2010, 11:31

Re: Klausurlösungen sammeln

Beitrag von BuzzDee » Do 11. Mär 2010, 08:53

wenn man von statisch und dynamisch spricht dann sind das mehr eigenschaften des speichers:

statischer speicher kann nicht wärend des laufenden programms manuell erweitert und veringert werden, er is eben "statisch".
dynamischer speicher hingegeben kann jederzeit (sofern das im programm entsprechend implementiert ist) angefordert und freigegeben.
static storage und stack sind beides statische speicher!
und vom stack können auch sachen genommen werden, die nicht zuletzt dort abgelegt wurden, wie auch immer das intern funktioniert.

außerdem noch ein beispiel zum malloc speicher:

nodeptr newnode (Partei neupartei)
{ nodeptr np;
np=(nodeptr)malloc(sizeof(Node));

strcpy(np->data.name, neupartei.name);
np->data.mitglieder=neupartei.mitglieder;
np->data.stimmen_prozentual=neupartei.stimmen_prozentual;
np->next=NULL;
return np;
}

hier sieht man genau: es wird erst nur ein nodeptr zeiger deklariert. d.h. einfach ein objekt mit 4 bzw 8 bytes größe, die momentan noch auf nichts zeigt.
anschließend gibt malloc eine adresse an np zurück, sodass np nun auf eine stelle im dynamischen speicher zeigt, an der platz von der größe einer node reserviert ist.
anschließend werden die daten manuell dort hineinkopiert, der next zeiger wird deklariert und der zeiger auf die node wird zurückgegeben. mit dem beenden der fkt werden alle lokalen variablen (also auch die partei neupartei, die übergeben wurde) gelöscht. (zumindest werden, sobald die funktion geschlossen ist, laut großübung auch nicht mehr die variablen im stack aufgeführt).

Antworten

Zurück zu „Info I“