Динамический массив в стеке?
Это правильно?
Это скомпилировано с помощью g++ (3.4).
int main()
{
int x = 12;
char pz[x];
}
Ответы
Ответ 1
Вот ваш комбинированный ответ от всех этих других:
Теперь ваш код не стандартный С++. Это стандарт C99. Это связано с тем, что C99 позволяет объявлять массивы динамически таким образом. Чтобы уточнить это, это также стандарт C99:
#include <stdio.h>
int main()
{
int x = 0;
scanf("%d", &x);
char pz[x];
}
Это не стандартное что-либо:
#include <iostream>
int main()
{
int x = 0;
std::cin >> x;
char pz[x];
}
Он не может быть стандартным С++, потому что для этого требуются постоянные размеры массива, и он не может быть стандартным C, потому что C не имеет std::cin
(или пространства имен или классы и т.д.)
Чтобы сделать его стандартным С++, сделайте следующее:
int main()
{
const int x = 12; // x is 12 now and forever...
char pz[x]; // ...therefore it can be used here
}
Если вам нужен динамический массив, вы можете сделать это:
#include <iostream>
int main()
{
int x = 0;
std::cin >> x;
char *pz = new char[x];
delete [] pz;
}
Но вы должны это сделать:
#include <iostream>
#include <vector>
int main()
{
int x = 0;
std::cin >> x;
std::vector<char> pz(x);
}
Ответ 2
Технически это не часть С++. Вы можете делать массивы переменной длины в C99 (ISO/IEC 9899: 1999), но они не являются частью С++. Как вы обнаружили, они поддерживаются как расширение некоторыми компиляторами.
Ответ 3
g++ поддерживает функцию C99, которая позволяет массивы с динамическим размером. Это не стандартный С++. g++ имеет параметр -ansi
, который отключает некоторые функции, которые не находятся на С++, но это не один из них. Чтобы g++ отверг этот код, используйте параметр -pedantic
:
$ g++ -pedantic junk.cpp
junk.cpp: In function ‘int main()’:
junk.cpp:4: error: ISO C++ forbids variable-size array ‘pz’
Ответ 4
Если вам нужен динамический массив в стеке:
void dynArray(int x)
{
int *array = (int *)alloca(sizeof(*array)*x);
// blah blah blah..
}
Ответ 5
Выделение массивов переменной длиной в стеке является хорошей идеей, поскольку оно быстро и не фрагментирует память. Но, к сожалению, С++ Standard этого не поддерживает. Вы можете сделать это, используя оболочку шаблона для функции alloca
. Но использование alloca
на самом деле не соответствует стандарту.
Стандартный способ - использовать std::vector с настраиваемым распределителем, если вы хотите избежать фрагментации памяти и распределения памяти ускорения. Посмотрите boost:: pool_alloc для хорошего образца быстрого распределителя.
Ответ 6
Практически говоря, если вы хотите создать динамический массив, вы должны использовать std::vector, как в:
#include <iostream>
#include <cstdlib>
#include <vector>
int main(int argc, char* argv[])
{
int size;
std::cin>>size;
std::vector<int> array(size);
// do stuff with array ...
return 0;
}
Если вам просто интересно узнать о синтаксисе, то вы ищете:
//...
int* array = new int[size];
// Do stuff with array ...
delete [] array;
//...
Ни один из них не выделяется локальным хранилищем. Массив динамического размера, который автоматически распределяется с использованием локального хранилища, в настоящее время не поддерживается в стандартном С++, но поддерживается в текущем стандарте C.