Переменная длина по сравнению с массивами Malloc-ed - PullRequest
8 голосов
/ 08 июля 2011

В соответствии со стандартом c99, мы можем написать следующий код, и он полностью допустимснова массивы?

Кроме того, не могли бы вы объяснить, как происходит распределение массивов переменной длины?Глубоко внутри он вызывает malloc для выделения массива или как?

Ответы [ 3 ]

12 голосов
/ 08 июля 2011

Мне приходят в голову две причины:

  1. Массивы, которые находятся за пределами этого стека.
  2. Массивы, которые больше стека.
4 голосов
/ 08 июля 2011

Распределение массива переменной длины (или фактически любое объявление массива) выполняется в стеке (при условии компилятора GCC). Маллок выделяет память из кучи.

Два преимущества кучи против стека: 1. Стек намного меньше. Существует большая вероятность того, что ваш массив переменного размера может вызвать переполнение вашего стека. 2. Элементы, размещенные в стеке, не сохраняются после функции, которую они были объявлены в возвращениях.

2 голосов
/ 20 июля 2018

В стандарте C11 массивы переменной длины стали «необязательными», что я понимаю как «определенные реализацией», и поэтому они больше не являются переносимыми.

Это показано на

6.7.6.2 Раздел объявлений массивов 4

Массивы переменной длины - это условная функция, которую реализации не должны поддерживать.

и

6.10.8.3 Макросы условных объектов, раздел 1

__STDC_NO_VLA__ Целочисленная константа 1, предназначенная для указания того, что реализация не поддерживает массивы переменной длины или переменно измененные типы.

Некоторые преимущества использования malloc перед VLA :

  • Реализация malloc обычно получает память из кучи , которая в большинстве CРеализации являются большим ресурсом, чем стек .Однако ни heap , ни stack не упоминаются в стандарте C, но они являются распространенными способами реализации глобальной и локальной памяти.
  • Память, полученная из malloc, может бытьувеличивается или уменьшается на realloc, но это невозможно с VLA.
  • Память, полученная из malloc, может передаваться по программе до free d с указателями, но VLA может использоваться тольков иерархии функций.VLA становится мертвым после того, как функция, в которой он определен, возвращается, потому что он выходит из области видимости.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...