Зачем мне динамическое выделение памяти, если я могу просто создать массив?

Я читал о динамическом распределении памяти и статическом распределении памяти и нашел следующее о динамическом распределении памяти:

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

Поэтому я написал следующую программу на C++:

#include <iostream>

int main()
{
  int n = 0;
  int i = 0;

  std::cout << "Enter size: ";
  std::cin >> n;
  int vector[n];

  for (i=0; i<n; i++)
  {
    vector[i] = i;
  }

  return 0;
}

Эта программа работает. Я не понимаю, как это работает. Когда здесь определяется размер? Как распределяется вектор в этом случае?

3 ответа

Решение

По этому (выделено мое):

Автоматические массивы переменной длины разрешены в ISO C99, и в качестве расширения GCC принимает их в режиме C90 и в C++. Эти массивы объявляются как любые другие автоматические массивы, но с длиной, которая не является константным выражением. Хранилище выделяется в точке объявления и освобождается при выходе из области блока, содержащей объявление.

Обратите внимание, что это просто расширение и оно не будет работать на каждом компиляторе, например, оно не работает для меня в MSVC (я получаю ошибку "выражение должно иметь постоянное значение").

Еще один важный из gcc docs:

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

Есть и другие различия между этими двумя методами. Пространство, выделенное с помощью alloca, существует до тех пор, пока не вернется содержащая функция Пространство для массива переменной длины освобождается, как только заканчивается область имени массива. (Если вы используете массивы переменной длины и alloca в одной и той же функции, освобождение массива переменной длины также приведет к освобождению всего, что было недавно выделено с помощью alloca.)

alloca - выделить память, которая автоматически освобождается Функция alloca() распределяет байты размера пространства в кадре стека вызывающей стороны. Это временное пространство автоматически освобождается, когда функция, вызвавшая alloca(), возвращается к своему вызывающему. Функция alloca() зависит от машины и компилятора. Для некоторых приложений его использование может повысить эффективность по сравнению с использованием malloc(3) плюс free(3).

Так что для вас, я думаю, применимы те же утверждения, что и для alloca:

Отсутствует индикация ошибки, если кадр стека не может быть расширен. (Однако после неудачного размещения программа, вероятно, получит сигнал SIGSEGV, если попытается получить доступ к нераспределенному пространству.)

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

Выше кода будет генерировать ошибку в последней версии компилятора. Этот код будет работать в старой версии DOSBOX.

Размер массива должен быть постоянным целым числом.

Таким образом, вы можете определить это двумя способами

1.# определить макрон

#include<iostream>
#define n 5

main() {
   ...
      ...
      int array[n];
}

Ключевое слово 2.const

#include<iostream>
....
main() {
   int x;
   cout << "Enter Size Of Array";
   cin >> x;

   const int n = x;

   int array[n];
   ...
      ...
}
Другие вопросы по тегам