Intereting Posts

Когда мне нужна динамическая память?

Возможный дубликат:
Определение Malloc или обычного массива?

Мы узнаем, что в C и динамических переменных имеется динамическая память:

#include  int a = 17; int main(void) { int b = 18; //automatic stack memory int * c; c = malloc( sizeof( int ) ); //dynamic heap memory *c = 19; printf("a = %d at address %x\n", a, &a); printf("b = %d at address %x\n", b, &b); printf("c = %d at address %x\n", *c, c); free(c); system("PAUSE"); return 0; } 

Как узнать, какой тип памяти использовать? Когда я нахожусь один или другой?

Используйте динамику в следующих ситуациях:

  1. Когда вам нужно много памяти. Типичный размер стека составляет 1 МБ, поэтому лучше, чем 50-100 КБ, должно быть динамически распределено или вы рискуете столкнуться. Некоторые платформы могут иметь этот предел еще ниже.

  2. Когда память должна работать после возвращения функции. Память стека уничтожается, когда функция заканчивается, динамическая память освобождается, когда вы хотите.

  3. Когда вы строите структуру (например, массив или график) размера, который неизвестен (т. Е. Может стать большим), динамически изменяется или слишком сложно для предварительного расчета. Динамическое распределение позволяет вашему коду естественно запросить память по частям в любой момент и только тогда, когда вам это нужно. Невозможно повторно запрашивать все больше пространства стека в цикле for .

Предположите, что распределение пакетов в противном случае. Это быстрее и не может течь.

Вы используете динамическую память, когда размер вашего распределения неизвестен заранее только во время выполнения.

Например, вы попросите пользователя ввести имена (пусть говорят до 10 имен) и сохранить их в массиве строк. Поскольку вы не знаете, сколько имен пользователь предоставит (только на время выполнения), вам придется выделять массив только после того, как вы знаете, сколько выделить, чтобы использовать динамическое распределение.

Конечно, вы можете использовать массив фиксированного размера 10, но для больших сумм это будет расточительно

Если вы можете программировать без динамического выделения, не используйте его!
Но в день вы будете заблокированы, и единственный способ разблокировать вас – использовать динамическое распределение, а теперь вы можете его использовать

Используйте динамическое распределение памяти, если вы точно не знаете , сколько памяти потребуется вашей программе во время компиляции.

int a[n] например, ограничит ваш размер массива n. Кроме того, он выделяет nx 4 байта памяти независимо от того, используете вы это или нет. Это выделяется в стеке, а переменная n должна быть известна во время компиляции.

int *a = (int *)malloc(n * sizeof (int)) с другой стороны, выделенное во время выполнения, в куче, а n нужно знать только во время выполнения, не обязательно во время компиляции.

Это также гарантирует, что вы выделяете столько же памяти, сколько вам действительно нужно. Однако, поскольку вы выделили его во время выполнения, очистка должна производиться вами, используя free .

Вы должны использовать динамическую память, если:

  • Если вы хотите, чтобы ваш объект сохранялся за пределами области, в которой он был создан.
  • Обычно размеры стека ограничены, и, следовательно, если ваш объект занимает много памяти, тогда вы можете столкнуться со стеком, в таких случаях обычно идет динамическое распределение памяти.

Обратите внимание, что стандарт c99 вводит Variable Length Arrays (VLA) в C, поэтому вам не нужно использовать динамическое распределение памяти только потому, что вы не знаете размеры массива перед рукой (если только не указано выше #2 )

Лучше всего избегать распределения динамической памяти, насколько это возможно, потому что это означает явное управление памятью вместо автоматического механизма, предоставляемого языком. Неявное управление памятью означает, что вы склонны делать больше ошибок, что может привести к катастрофическим последствиям.
Сказав, что динамических распределений памяти нельзя всегда избегать и их необходимо использовать, когда использование является обязательным (два случая, упомянутые выше).

Als сделал интересный момент, что вы должны выделить память из кучи, если ваш объект должен оставаться за пределами области, в которой он был создан. В приведенном выше коде вам не нужно выделять память из кучи вообще. Вы можете переписать его так:

 #include  int a = 17; int main(void) { int b = 18; //automatic stack memory int c[1]; // allocating stack memory. sizeof(int) * 1 c[0] = 19; printf("a = %d at address %x\n", a, &a); printf("b = %d at address %x\n", b, &b); printf("c = %d at address %x\n", c[0], c); system("PAUSE"); return 0; } 

Фактически, как часть стандарта C99 ( массив переменной длины ), вы можете использовать оператор [] для распределения динамического пространства для массива в стеке, как обычно, для создания массива. Вам даже не нужно знать размер массива во время компиляции. Компилятор просто настроит регистр esp (для машин x86 ) на основе запрошенного пространства для размещения, и вам хорошо идти.