Klausurlösungen sammeln
Moderator: Moderatoren
Re: Klausurlösungen sammeln
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...
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...
Re: Klausurlösungen sammeln
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
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
Re: Klausurlösungen sammeln
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"
da wird eindeutig gesagt schon auf den ersten folien in den gedankenblasen:
"lokale variablen landen auf dem stack"
Re: Klausurlösungen sammeln
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?
Re: Klausurlösungen sammeln
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!
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!
Re: Klausurlösungen sammeln
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...
Re: Klausurlösungen sammeln
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).
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).
Re: Klausurlösungen sammeln
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
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
Re: Klausurlösungen sammeln
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).
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).
Re: Klausurlösungen sammeln
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).
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).