Задать вопрос
@Monstrikk

Статический и динамический массив в С?

Я учусь по книге "Язык программирования Си для начинающих. Грег Перри. Ден Миллер" и остановился на указателях и динамической памяти. У меня возник вопрос.

Зачем писать так:

int length;
scanf("%d", &length);
int *a = (int*) malloc(length * sizeof(int));


Когда можно писать вот так:
int length;
scanf("%d", &length);
int a[length];


В чем разница и когда нужно использовать статический и динамический массив?
  • Вопрос задан
  • 981 просмотр
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Так сделать просто нельзя :)

Обьявить массив переменного размера - невозможно. Все обьявления должны быть вычислены заранее, потому что помещаются в "кучу". И они все будут присутствовать в слинкованном бинарнике. И можно спланировать эксплойт выходом за границу.
Статические массивы - зло.

Кроме того, вместо malloc привыкайте сразу использовать calloc - это спасет от SIGSEGV, возникающих у нубов "на ровном месте" просто из-за того, что забыли проинициализировать память, полученную от системы.
Ответ написан
@zedxxx
Разница во времени жизни и в месте размещения в памяти такого массива.

Динамический массив размещается в куче и живёт до тех пор, пока вы его руками не удалите (вызовом free(a)).

Статический* массив живёт на стеке и удаляется при выходе переменной из области видимости. Плюс ко всему, поскольку стек обычно имеет ограниченный размер, создание очень большого статического массива приведёт к ошибке переполнения стека (stack overflow).

P. S. Только такой массив называется не статический, а Variable Length Array (массив переменной длины).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы