Speicherabbild zeichnen
-
Hi!
Ich habe leider fast keine Ahnung, wie das gehen soll:
Zeichnen Sie das Speicherabbild für folgenden C-Code nach Ausführung aller Anweisung außer der return-Anweisung (Programm wurde bis Zeile 15 einschließlich abgearbeitet).
1 #include <stdio.h> 2 typedef struct node { 3 int d; 4 struct node *n; 5 } Node, *nodeptr; 6 7 int main() { 8 nodeptr p1, *b; 9 Node n2; 10 p1 = (nodeptr)malloc(sizeof(struct node)); 11 p1->d = 3; 12 n2.d = 5; 13 b = &p1; 14 p1->n = &n2; 15 n2.n = NULL; 16 return 0; 17 }
Das wurde nur extrem grob angesprochen. Es wurden die drei Speicher Stack, Static und Heap eingezeichnet und dort Eintragungen gemacht.
Ich weiß nur, dass auf den Heap die lokalen Variablen kommmen und auf den Static globale.
-
Auf dem Stack liegen lokale Variablen
Node *p1 // Addresse Node **b //Addresse n2 //Inhalt aus n2 bestehen aus { int d // Integer und Node *n // Addresse }
Auf dem Heap leigen mit malloc angefordere Daten:
p1 //Inhalt von p1 bestehend aus { int d //Integer Node* n //Addresse }
Static ist leer.
Ist natürlich nur Pseudocode wies im Speicher aussieht.
Werte musst du selber eintragen, Struktur müsste so stimmen.
-
Der globale Datentyp der vor main definiert wird muss nirgends in den Speicher geschrieben werden? Ich dachte der kommt eventuell auf den Static?
Warum liegt im struct p1 der Pointer Node *n? warum nicht einfach nur *n? Wie kommt hier das "Node" dazu?
Wie zeige ich, dass ein Zeiger auf "NULL" zeigt? Wo liegt "NULL"?
-
Krachi schrieb:
Der globale Datentyp der vor main definiert wird muss nirgends in den Speicher geschrieben werden? Ich dachte der kommt eventuell auf den Static?
Das ist ein Typ. Eine Deklaration, keine Definition. Da wird kein Speicher belegt.
Krachi schrieb:
Warum liegt im struct p1 der Pointer Node *n? warum nicht einfach nur *n? Wie kommt hier das "Node" dazu?
Node ist eine Kurzschreibweise für struct node (durch das typedef). Zeiger sind in C typgebunden. Der Compiler muss wissen, worauf der Zeiger verweist.
Krachi schrieb:
Wie zeige ich, dass ein Zeiger auf "NULL" zeigt? Wo liegt "NULL"?
Zeiger speichern eine Adresse. Also ist bei
NULL
der Inhalt von dem Zeiger 0. Das ist auch nicht anders, als wenn duint i = 0;
schreibst.Ein Zeiger ist eine Variable. Die nimmt halt keine Fließkommazahl oder Zeichen oder Ganzzahl auf, sondern eine Adresse.
Mit dem Dereferenzierungsoperator * kommst du an den Wert, auf den der Zeiger verweist. Ohne bekommst du den Inhalt vom Zeiger (die Adresse die er speichert).
-
Node ist eine Kurzschreibweise für struct node (durch das typedef). Zeiger sind in C typgebunden. Der Compiler muss wissen, worauf der Zeiger verweist.
Kannst du mir das noch einmal näher erläutern? Irgendwie hakts da etwas bei mir.
In meinem struct sind zwei Datentypen enthalten. Einmal int d und einmal ein Zeiger *n vom Typ struct node dachte ich?Node ersetzt dann weil es hinter dem Inhalt des structs geschrieben steht aufgrund des typedef-Befehls die Anweisung struct node?
Muss ich nicht trotzdem noch auf *n irgendwie zugreifen?
-
in deiner struct node sind zwei Elemente enhalten. Das eine heißt d und ist vom Typ
int
. Das andere heißt n und ist vom Typ Zeiger auf struct nodestruct node ist keine Anweisung sondern ein Typbezeichner.
Mit demtypedef
sagst du dem Compiler, dass du für struct node noch einen anderen Typbezeichner haben willst.Was meinst du mit "noch auf *n irgendwie zugreifen?"
Willst du wissen, wie man das macht?