2016-08-18 3 views
0
typedef struct Node { 
    int data; 
    struct Node *next; 
} node; 

pointer->next = (node*)malloc(sizeof(node)); 

Wie viele Bytes des Speichers dynamisch an pointer->next im obigen Code übergeben werden. Für (int*)malloc(sizeof(int)) sind 2 Bytes angegeben. Ebenso wie viele für node?Wie viel Speicher ist für Knoten in C reserviert?

+1

Schreiben Sie den Code und überprüfen Sie. –

+0

Die Antwort hängt sehr vom Ziel ab. Warum willst du das statisch wissen? –

+0

2 Bytes für einen Zeiger ?! Erstellen Sie eine ausführbare 16-Bit-Datei? Hatte gerade Rückblenden von 1995. – itsme86

Antwort

1

Malloc wird die Größe von "node" dynamisch zuweisen.

Knoten ist eine Struktur und die Größe jeder Struktur hängt von der Größe jedes Elements innerhalb der Struktur ab.

In diesem Fall wird die Größe des Knotens sein: Größe von int + Größe von struct Node * (Wenn das Ergebnis nicht Vielfaches von 2 ist, wird es für die Architektur Gründen aufgefüllt werden) Ihr Gerät verfügt über eine Architektur 2 Bytes, und aus diesem Grund kann die Größe der Strukturen nur 2, 4, 6, 8 usw. sein.

Die Größe von int hängt von dem Ziel ab, an dem Sie arbeiten. Da Ihre Architektur 16 Bits hat, ist die Größe von int 2 Bytes.

Über. die Größe von struct Node *, Sie müssen wissen, dass EVERY Pointer-Datentypen genau die gleiche Größe haben, es spielt keine Rolle, auf welchen Datentyp sie verweisen. Und diese Größe hängt auch von der Architektur ab. Auch hier ist Ihre Architektur 16 Bit groß und deshalb beträgt die Größe des Strukturknotens * 2 Byte.

Größe von int = 2.

Größe von struct node * = 2

Summe von malloc zugeordneten Speicher = 2 + 2 = 4

+1

Diese Antwort ist meistens falsch. Beginnend mit dieser Anweisung: * In diesem Fall ist die Größe des Knotens: Größe von int + Größe von struct Node *. Es könnte Polsterung geben. –

+0

@EugeneSh. Nein, früher bei Zeile _ beginnen "Malloc wird die Größe von" Knoten "dynamisch zuweisen" _ Größe von "Knoten" wird vom Compiler zugewiesen (berechnet) – mvidelgauz

+0

Sie haben Recht, es wurde jetzt korrigiert. – cventu

1

Ohne viel über Ihr System zu wissen, nur wir kann ich dir nicht sagen. Sie können denselben Code verwenden und ihn in mehreren Compilern ausprobieren, und Sie erhalten unterschiedliche Antworten. Sie müssen sich selbst überprüfen, mit sizeof(node) oder sizeof(struct Node) (ich denke, entweder Syntax funktioniert, aber nur für den Fall).

+0

Randnotiz: Sobald Sie diese Nummer kennen, sollten Sie sie NIEMALS fest codieren. Verwenden Sie immer 'sizeof', um sicherzustellen, dass es korrekt ist, indem Sie es dem Compiler überlassen, es herauszufinden. – Cody

+0

Das sollte 'sizeof (node)' (mit einem Kleinbuchstaben 'n') sein. –

+0

Ich schrieb es ursprünglich so, aber die Frage hat es als 'N', also habe ich es in Großbuchstaben geändert. – Cody

1

Zuerst wird ein Vorschlag: umschreiben

pointer->next=(node*)malloc(sizeof(node)); 

als

pointer->next = malloc(sizeof *pointer->next); 

Sie die Besetzung nicht braucht (es sei denn, Sie auf einer bereits ANSI Implementierung arbeiten, wobei in diesem Fall Gott Hilfe Sie), und die Verwendung des dereferenzierten Ziels als Operand von sizeof bedeutet, dass Sie den Typ nicht angeben müssen, wodurch Sie möglicherweise etwas Wartungss Sodbrennen sparen.

Auch ein wenig Leerzeichen geht einen langen Weg (obwohl Sie keine Leerzeichen um die Funktionsargumente setzen müssen - das ist mein Stil, einige Leute mögen es nicht, aber es macht es leichter für mich zu lesen) .

Wieviel Byte Speicher wird dynamisch> nächste

Es wird mindestens so groß wie sizeof (int) Plus sizeof (struct Node *) und größer kann möglicherweise sein Pointer- gegeben; abhängig von Ihrer Plattform kann es so klein wie 4 Byte oder so groß wie 16 sein. C ermöglicht das "Auffüllen" von Bytes zwischen Strukturelementen, um die Ausrichtungsanforderungen für die zugrunde liegende Architektur zu erfüllen.Zum Beispiel kann eine bestimmte Architektur erfordern, dass alle Multi-Byte-Objekte auf Adressen ausgerichtet sind, die ein Vielfaches von 4 sind; Wenn Ihr data Mitglied nur 2 Bytes breit ist, dann werden 2 unbenutzte Bytes zwischen ihm und dem next Mitglied sein.

Verwandte Themen