Динамический массив в стеке? - PullRequest
16 голосов
/ 30 июля 2009

Это правильно? Это успешно скомпилировано с g ++ (3.4).

int main()
{
    int x = 12;
    char pz[x]; 
}

Ответы [ 6 ]

17 голосов
/ 30 июля 2009

Вот ваш комбинированный ответ на все остальные:

Ваш код сейчас , а не стандарт C ++. Это это стандарт 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, потому что C не имеет std::cin (или пространств имен, или классов и т. Д.)

Чтобы сделать его стандартным C ++, сделайте следующее:

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);
}
13 голосов
/ 30 июля 2009

G ++ поддерживает функцию C99, которая допускает динамические размеры массивов. Это не стандартный C ++. В G ++ есть опция -ansi, которая отключает некоторые функции, отсутствующие в C ++, но это не одна из них. Чтобы G ++ отклонил этот код, используйте параметр -pedantic:

$ <b>g++ -pedantic junk.cpp</b>
junk.cpp: In function ‘int main()’:
junk.cpp:4: error: ISO C++ forbids variable-size array ‘pz’
13 голосов
/ 30 июля 2009

Технически, это не часть C ++. Вы можете создавать массивы переменной длины в C99 (ISO / IEC 9899: 1999), но они не являются частью C ++. Как вы обнаружили, они поддерживаются некоторыми компиляторами как расширение.

7 голосов
/ 30 июля 2009

Если вы хотите динамический массив в стеке:

void dynArray(int x)
{
    int *array = (int *)alloca(sizeof(*array)*x);

    // blah blah blah..
}
5 голосов
/ 30 июля 2009

Распределение массивов с переменной длиной в стеке - хорошая идея, потому что это быстро и не фрагментирует память. Но C ++ Standard, к сожалению, не поддерживает это. Вы можете сделать это, используя шаблонную оболочку для функции alloca. Но использование alloca на самом деле не соответствует стандарту.

Стандартным способом является использование std :: vector с настраиваемым распределителем , если вы хотите избежать фрагментации памяти и ускорения выделения памяти. Посмотрите на boost :: pool_alloc для хорошего примера быстрого распределителя.

2 голосов
/ 30 июля 2009

На практике, если вы хотите создать динамический массив, вы должны использовать 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 ++, но поддерживается в текущем стандарте C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...