В чем разница между статическим массивом и динамическим массивом в C ++?
Я должен выполнить задание для своего класса, и в нем говорится, что нельзя использовать статические массивы, а только динамические массивы. Я искал в книге и в Интернете, но, кажется, не понимаю.
Я думал, что статика была создана во время компиляции, а динамическая - во время выполнения, но я мог ошибиться с выделением памяти.
Можете ли вы объяснить разницу между статическим массивом и динамическим массивом в C ++?
Ответы:
Локальные массивы создаются в стеке и имеют автоматическую продолжительность хранения - вам не нужно вручную управлять памятью, но они уничтожаются, когда функция, в которой они находятся, заканчивается. У них обязательно есть фиксированный размер:
int foo[10];
Массивы, созданные с помощью,
operator new[]
имеют динамическую продолжительность хранения и хранятся в куче (технически «бесплатное хранилище»). Они могут иметь любой размер, но вам нужно выделить и освободить их самостоятельно, поскольку они не являются частью фрейма стека:int* foo = new int[10]; delete[] foo;
источник
int* foo = new int[N]
которые есть уdelete
вас, и поэтому будьте осторожны при наличии исключения. Статические массивы не имеют этих проблем.static - это ключевое слово в C и C ++, поэтому вместо общего описательного термина static имеет очень конкретное значение при применении к переменной или массиву. Чтобы усугубить путаницу, у него есть три различных значения в разных контекстах. По этой причине статический массив может быть фиксированным или динамическим.
Позволь мне объяснить:
Первый специфичен для C ++:
Два унаследованы от C:
внутри функции статическая переменная - это переменная, место в памяти которой сохраняется между вызовами функций. Он статичен в том смысле, что инициализируется только один раз и сохраняет свое значение между вызовами функций (использование статики делает функцию нереентерабельной, т.е. не потокобезопасной)
статические переменные, объявленные вне функций, являются глобальными переменными, к которым можно получить доступ только из того же модуля (файл исходного кода с любыми другими # include)
Вопрос (я думаю), который вы хотели задать, заключается в том, в чем разница между динамическими массивами и фиксированными массивами или массивами времени компиляции. Это более простой вопрос, массивы времени компиляции определяются заранее (при компиляции программы) и являются частью фрейма стека функций. Они выделяются до запуска основной функции. динамические массивы выделяются во время выполнения с помощью ключевого слова "new" (или семейства malloc из C), и их размер заранее не известен. динамические выделения не очищаются автоматически, пока программа не остановится.
источник
new[]
оператора, как получается, что размер неизвестен до времени выполнения? ieint* p = new int[10]
Я думаю, что семантика, используемая в вашем классе, сбивает с толку. Под «статическим», вероятно, подразумевается просто «постоянный размер», а под «динамическим», вероятно, подразумевается «переменный размер». В этом случае массив постоянного размера может выглядеть так:
int x[10];
а «динамическая» - это просто любая структура, которая позволяет увеличивать или уменьшать базовое хранилище во время выполнения. В большинстве случаев достаточно
std::vector
класса из стандартной библиотеки C ++. Используйте это так:std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized.
std::vector
имеетoperator[]
значение, так что вы можете использовать его с той же семантикой , как массив.источник
new int[10]
Статическим массивам выделяется память во время компиляции, а память выделяется в стеке. В то время как динамическим массивам выделяется память во время выполнения, а память выделяется из кучи.
int arr[] = { 1, 3, 4 }; // static integer array. int* arr = new int[3]; // dynamic integer array.
источник
Важно иметь четкие определения того, что означают термины. К сожалению, существует несколько определений того, что означают статические и динамические массивы.
Статические переменные - это переменные, определенные с использованием статического распределения памяти . Это общая концепция, не зависящая от C / C ++. В C / C ++ мы можем создавать статические переменные с глобальной, файловой или локальной областью видимости следующим образом:
int x[10]; //static array with global scope static int y[10]; //static array with file scope foo() { static int z[10]; //static array with local scope
Автоматические переменные обычно реализуются с использованием выделения памяти на основе стека . Автоматический массив можно создать на C / C ++ следующим образом:
foo() { int w[10]; //automatic array
Общим для этих массивов,
x, y, z
иw
является то, что размер каждого из них фиксирован и определяется во время компиляции.Одна из причин, по которой важно понимать различие между автоматическим массивом и статическим массивом, заключается в том, что статическое хранилище обычно реализуется в разделе данных (или разделе BSS ) объектного файла, и компилятор может использовать абсолютные адреса для доступа к массивам. что невозможно при хранении на основе стека.
Под динамическим массивом обычно подразумевается не тот, размер которого можно изменять, а тот, который реализован с использованием динамического распределения памяти с фиксированным размером, определяемым во время выполнения. В C ++ это делается с помощью
new
оператора .foo() { int *d = new int[n]; //dynamically allocated array with size n
Но можно создать автоматический массив с размером исправлений, определенным во время выполнения, используя
alloca
:foo() { int *s = (int*)alloca(n*sizeof(int))
Для настоящего динамического массива следует использовать что-то вроде
std::vector
C ++ (или массив переменной длины в C ).Что означало задание в вопросе ОП? Я думаю, ясно , что то , что хотели , не был статичным или автоматическим массивом , но один , который используется либо динамическое распределение памяти с помощью
new
оператора или массив нефиксированного размера , используя , напримерstd::vector
.источник
Я думаю, в этом контексте это означает, что он статичен в том смысле, что размер фиксирован. Используйте std :: vector. Он имеет функцию resize ().
источник
У вас может быть псевдодинамический массив, размер которого устанавливается пользователем во время выполнения, но затем фиксируется после этого.
int size; cin >> size; int dynamicArray[size];
источник
Статический массив :
Динамический массив:
источник
Да, верно, статический массив создается во время компиляции, а динамический массив создается во время выполнения. В то время как разница касается их ячеек памяти, статические находятся в стеке, а динамические создаются в куче. Все, что находится в куче, требует управления памятью до тех пор, пока не будет установлен сборщик мусора, как в случае .NET Framework, в противном случае существует риск утечки памяти.
источник
Статический массив: Эффективность. Никакого динамического выделения или освобождения не требуется.
Массивы, объявленные в C, C ++ в функциях, включая модификатор static, являются статическими. Пример: static int foo [5];
источник
статические произвольные действия с подачей элементов в сторону массива
динамические произвольные действия без добавления элементов в массив
пример:
char a[10]; //static array char a[]; //dynamic array
источник