2015-02-16 3 views
2

Часто говорят, чтобы использовать таНос когда размер известен во время выполнения мы могли бы также написатьMalloc против статического массива в C

int x; 
scanf("%d",&x); 
char arr[x]; 

так почему использование таНос когда мы можем объявить массив на лету.

+2

@YassineHoussni ugh, huuge утверждает. Операция «это быстрее» даже ошибочна. Динамическое распределение памяти является одной из самых медленных «примитивных» операций. Обычно декларация VLA делает память доступной почти мгновенно (это только указатель стека, который нужно добавить/вычесть определенное число), в отличие от 'malloc()', который предполагает поиск через свободный магазин (потенциально и часто реализуемый с использованием сложных структур данных с большими постоянными множителями). –

+0

Кто-то должен также помнить, что в то время как 'malloc()' требует 'free()' VLA's, этого нет, и это очень важно специально для больших массивов. –

ответ

2

Запись char arr[x]; будет выделять память в стеке.

Размер стека обычно ограничен примерно 1 МБ. Вы получите ошибки времени выполнения, если вы превысите эту предопределенную сумму. Некоторые компиляторы позволят вам изменить размер стека, но вы по-прежнему сможете достичь предела в конце концов на много порядков, чем вы можете получить с malloc.

+0

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

+2

Я не думаю, что стек, как правило, настолько мал, и во всех ответах нет рекомендаций по использованию 'free()', которые в случае использования 'malloc()' просто потому, что стек не соответствует данным для это размер, действительно очень важно. –

+0

@iharob: https://msdn.microsoft.com/en-us/library/windows/desktop/ms686774%28v=vs.85%29.aspx 1 Мб по умолчанию в Windows (запрошенный размер хранится в исполняемом файле), 8 Мбайт по умолчанию на моей 64-битной машине Linux (согласно 'ulimit -s'). Я бы не стал загружать изображение или что-нибудь большее на него (особенно потому, что переполнение стека особенно неприятно для Windows, процесс просто исчезает). –

1

VLA [Массив переменной длины] представляет собой концепцию, представленную в C99 и далее.

malloc() возникает много до этого.

Также malloc() и семья выделяет память из кучи. Он не использует сравнительно ограниченное пространство стека.

OTOH, gcc выделяет пространство для VLA s в самом стеке.

Смежные вопросы