Подтвердить что ты не робот

Malloced array VS. переменная длина массив

Существует два способа выделения памяти массиву, размер которого неизвестен в начале. Самый распространенный способ - использовать malloc как этот

int * array;
... // when we know the size
array = malloc(size*sizeof(int));

Но он также действует в C99 для определения массива после того, как мы знаем размер.

... // when we know the size
int array[size];

Являются ли они абсолютно тем же?

4b9b3361

Ответ 1

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

  • Вы можете free() malloced array, но вы не можете free() массив переменной длины (хотя он выходит за пределы области действия и перестает существовать после того, как останется блокирующий блок). На техническом жаргоне они имеют разную продолжительность хранения: выделено для malloc против автоматического для массивов переменной длины.
  • Хотя C не имеет понятия о стеке, многие реализации выделяют массив переменной длины из стека, а malloc выделяется из кучи. Это проблема в системах с ограниченным стеком, например. многие встроенные операционные системы, где размер стека составляет порядка kB, а куча намного больше.
  • Также легче проверить неудавшееся выделение с помощью malloc, чем с массивом переменной длины.
  • malloced memory может быть изменена в размере с помощью realloc(), в то время как VLA не может (точнее, только путем повторного выполнения блока с другим размером массива, который теряет предыдущее содержимое).
  • Реализованная реализация C89 поддерживает только malloc().
  • Реализованная реализация C11 может не поддерживать массивы переменной длины (тогда она должна определять __STDC_NO_VLA__ как целое число 1 согласно C11 6.10.8.3).
  • Все остальное, что я пропустил: -)