2017-01-04 21 views
18

Czy są jakieś różnice w wykorzystaniu pamięci przez te dwie linie kodu?Ile pamięci przypisze int x [10]?

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

Pierwsza linia powinna przydzielić pamięć dla 10 elementów i 1 wskaźnika. Ale nie jestem pewien co do drugiego. Czy to również przydzieli pamięć dla 10 ints i 1 wskaźnika, czy tylko 10 ints?

Odpowiedz

21

Upraszczając:

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

przydziela przynajmniej sizeof(int*) bajtów automatycznego magazynowania dla wskaźnika *a. Po wywołaniu malloc przydzieli to co najmniej sizeof(int) * 10 bajtów pamięci dynamicznej dla twojego programu.

Z drugiej strony:

int b[10]; 

przydziela przynajmniej sizeof(int) * 10 bajtów automatycznego przechowywania. Tutaj nie ma żadnych wskazówek. Kiedy używasz nazwy b w wyrażeniu (przykład: a = b), znika ona do wskaźnika. Ale a jest wskaźnikiem, a b jest tablicą. Sprawdź to w C FAQ: C-FAQ Sec. 6: arrays and pointers.

W najczęstszym przypadku "automatyczne magazynowanie" oznacza "stos", a "dynamiczne magazynowanie" oznacza "stos". Ale to nie zawsze prawda. Możesz przeczytać trochę dyskusji na temat tego pojęcia w tym pytaniu: "Why are the terms “automatic” and “dynamic” preferred over the terms “stack” and “heap” in C++ memory management?".

+7

Może alokować dowolną pamięć w stosie dla wskaźnika '* a' w zależności od działania kompilatora. Jeśli używasz 'i a' w dowolnym miejscu, tak, ale w przeciwnym razie wszystkie zakłady są wyłączone. –

+0

Dzięki. Poproszę moją odpowiedź. – giusti

+1

@DietrichEpp Czytanie ponownie, być może źle zrozumiałem twój komentarz. Czy możesz dać mi konkretny przykład? – giusti

8

W pierwszym przypadku, sama a zajmuje sizeof(int *) bajtów pamięci automatycznej i wskazuje na 10 * sizeof(int) bajtów pamięci dynamicznej.

W tym ostatnim przypadku b zajmuje 10 * sizeof(int) bajtów pamięci automatycznej. Ponieważ b jest tablicą, nie ma wskaźnika.

Pierwszy przypadek wykorzystuje więcej całkowitych bajtów, ale mniej na stosie (zakładając, że stos jest używany do automatycznego przechowywania).

Jeśli całkowita liczba używanych bajtów jest stosunkowo mała, automatyczne przechowywanie jest zwykle w porządku. W przypadku większych ilości preferowane jest przechowywanie dynamiczne. W szczególności dla implementacji stosu zbyt duża liczba zbyt dużych zmiennych automatycznych może przepełnić stos.