Wie viel Speicher benötigt int x[10] zuordnen?

Lesezeit: 2 Minuten

Gibt es einen Unterschied in der Speichernutzung dieser beiden Codezeilen?

int *a = malloc( 10 * sizeof(int) );
int b[10];

Die erste Zeile sollte Speicher für 10 Ints und 1 Zeiger zuweisen. Aber beim zweiten bin ich mir nicht sicher. Wird dadurch auch Speicher für 10 Ints und 1 Zeiger oder nur 10 Ints zugewiesen?

Benutzer-Avatar
giusti

Einfach gesagt:

int *a = malloc( 10 * sizeof(int) );

Ordnet mindestens zu sizeof(int*) Bytes des automatischen Speichers für den Zeiger *a. Wann malloc aufgerufen wird, wird diese zumindest zugeteilt sizeof(int) * 10 Bytes dynamischer Speicher für Ihr Programm.

Auf der anderen Seite:

int b[10];

Ordnet mindestens zu sizeof(int) * 10 Byte automatischer Speicherung. Hier gibt es keine Hinweise. Wenn Sie den Namen verwenden b in einem Ausdruck (Beispiel: a = b), es zerfällt in einen Zeiger. Aber a ist ein Zeiger und b ist ein Array. Überprüfen Sie dies auf C FAQ: C-FAQ Sek. 6: Arrays und Zeiger.

Im üblichsten Fall bedeutet “automatischer Speicher” den “Stack” und “dynamischer Speicher” den “Heap”. Aber das stimmt nicht immer. Vielleicht möchten Sie einige Diskussionen über diese Begriffe in dieser Frage lesen: „Warum werden die Begriffe „automatisch“ und „dynamisch“ in der C++-Speicherverwaltung den Begriffen „Stack“ und „Heap“ vorgezogen?“.

  • Es kann Speicher im Stack für Zeiger zuweisen oder auch nicht *a Je nachdem wie der Compiler arbeitet. Wenn du benutzt &a überall, ja, aber ansonsten sind alle Wetten geschlossen.

    – Dietrich Ep

    4. Januar 2017 um 15:58 Uhr

  • Vielen Dank. Ich werde meine Antwort ändern.

    – giusti

    4. Januar 2017 um 16:01 Uhr

  • @DietrichEpp Beim erneuten Lesen habe ich Ihren Kommentar möglicherweise falsch verstanden. Können Sie mir ein konkretes Beispiel geben?

    – giusti

    4. Januar 2017 um 16:10 Uhr

  • @giusti: Die Variable kann zum einen optimiert werden.

    – Dietrich Ep

    4. Januar 2017 um 16:16 Uhr

  • Aber das würde für jede Variable gelten. Gibt es etwas Besonderes bei Zeigern, das die Zuordnung anders macht, wenn Sie die Adresse des Zeigers nicht nehmen?

    – giusti

    4. Januar 2017 um 16:20 Uhr

Benutzer-Avatar
dbusch

Im ersten Fall, a selbst besetzt sizeof(int *) Bytes der automatischen Speicherung, und das zeigt auf 10 * sizeof(int) Bytes dynamischer Speicher.

Im letzteren Fall b besetzt 10 * sizeof(int) Byte automatischer Speicherung. Da b ein Array ist, gibt es keinen Zeiger.

Der erste Fall verwendet also insgesamt mehr Bytes, aber weniger auf dem Stack (vorausgesetzt, ein Stack wird für die automatische Speicherung verwendet).

Wenn die Gesamtzahl der verwendeten Bytes relativ klein ist, ist die automatische Speicherung normalerweise in Ordnung. Bei größeren Mengen wird eine dynamische Lagerung bevorzugt. Insbesondere bei Stapelimplementierungen können zu viele automatische Variablen, die zu groß sind, den Stapel überlaufen lassen.

1205150cookie-checkWie viel Speicher benötigt int x[10] zuordnen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy