Динамический массив в стеке?

Это правильно? Это скомпилировано с помощью 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.