Зачем мне динамическое выделение памяти, если я могу просто создать массив?
Я читал о динамическом распределении памяти и статическом распределении памяти и нашел следующее о динамическом распределении памяти:
В программах, рассмотренных в предыдущих главах, все потребности в памяти были определены до выполнения программы путем определения необходимых переменных. Но могут быть случаи, когда потребности программы в памяти могут быть определены только во время выполнения. Например, когда необходимая память зависит от пользовательского ввода.
Поэтому я написал следующую программу на 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];
...
...
}