2017-01-04 5 views
18

Gibt es Unterschiede in der Speichernutzung dieser beiden Codezeilen?Wieviel Speicher reserviert int x [10]?

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

Die erste Zeile sollte Speicher für 10 Zoll und 1 Zeiger zuweisen. Aber ich bin mir über die Sekunde nicht sicher. Wird das auch Speicher für 10 Ints und 1 Zeiger oder nur 10 Ints zuweisen?

Antwort

21

Einfach ausgedrückt:

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

Ordnen mindestens sizeof(int*) Bytes mit dynamischem Speicher für den Zeiger *a. Wenn malloc aufgerufen wird, wird dies mindestens sizeof(int) * 10 Bytes dynamischen Speicher für Ihr Programm reservieren.

Auf der anderen Seite:

int b[10]; 

Ordnet mindestens sizeof(int) * 10 Bytes mit dynamischem Speicher. Es gibt keine Hinweise hier. Wenn Sie in einem Ausdruck den Namen b verwenden (Beispiel: a = b), zerfällt es in einen Zeiger. Aber a ist ein Zeiger und b ist ein Array. Überprüfen Sie dies auf C FAQ: C-FAQ Sec. 6: arrays and pointers.

Im häufigsten Fall bedeutet "automatischer Speicher" den "Stack" und "dynamischer Speicher" bedeutet "Heap". Aber das stimmt nicht immer. Vielleicht möchten Sie ein paar Diskussionen über diese Begriffe in dieser Frage lesen: "Why are the terms “automatic” and “dynamic” preferred over the terms “stack” and “heap” in C++ memory management?".

+7

Es kann oder darf keinen Speicher im Stapel für den Zeiger '* a' zuweisen, abhängig davon, wie der Compiler funktioniert. Wenn du '& a' irgendwo verwendest, ja, ansonsten sind alle Wetten deaktiviert. –

+0

Danke. Ich werde meine Antwort verbessern. – giusti

+1

@DietrichEpp Noch einmal lesen, ich habe vielleicht Ihren Kommentar missverstanden. Können Sie mir ein konkretes Beispiel geben? – giusti

8

Im ersten Fall a selbst besetzt sizeof(int *) Bytes des automatischen Speichers, und das zeigt auf 10 * sizeof(int) Bytes des dynamischen Speichers.

Im letzten Fall belegt b10 * sizeof(int) Bytes des automatischen Speichers. Da b ein Array ist, gibt es keinen Zeiger.

Also der erste Fall verwendet mehr Gesamt-Bytes, aber weniger auf dem Stapel (vorausgesetzt, ein Stapel wird für die automatische Speicherung verwendet).

Wenn die Gesamtzahl der verwendeten Bytes relativ klein ist, ist der automatische Speicher normalerweise in Ordnung. Bei größeren Mengen ist dynamischer Speicher vorzuziehen. Insbesondere bei Stack-Implementierungen kann der Stack überlaufen, wenn zu viele automatische Variablen zu groß sind.

Verwandte Themen