изменилось ли поведение статических массивов? - PullRequest
1 голос
/ 18 февраля 2012

Я выучил c ++ около 6 лет назад, и я помню в разделе о массивах, если вы не создавали их экземпляры с использованием new, тогда их размер был статическим и мог быть установлен только в исходном коде с литеральными константами, но не во время выполнения.

Но я просто играл с учебником на

http://www.cplusplus.com/doc/tutorial/dynamic/

и попытался сделать это без нового, и, к моему удивлению, это сработало. Я что-то неправильно понимаю? Оригинальный код находится по указанному URL, но не так сложно увидеть, что это было из моего модифицированного кода ниже.

Я понимаю, что со строками, векторами и т. Д. ... массивы на самом деле не нужны (вероятно, объясняет, почему эта проблема никогда не случалась со мной), а просто развлекают меня:)

// rememb-o-matic
#include <iostream>
#include <new>
using namespace std;

int main ()
{
    int i,n;
//    int * p;
    cout << "How many numbers would you like to type? ";
    cin >> i;
    int p[i];
//    p= new (nothrow) int[i];
//    if (p == 0)
//        cout << "Error: memory could not be allocated";
    if (false)
        cout << "whut?" << endl;
    else
    {
        for (n=0; n<i; n++)
        {
            cout << "Enter number: ";
            cin >> p[n];
        }
        cout << "You have entered: ";
        for (n=0; n<i; n++)
            cout << p[n] << ", ";
//        delete[] p;
    }
    return 0;
}

Ответы [ 2 ]

4 голосов
/ 18 февраля 2012

Код работает, потому что большинство компиляторов поддерживают массивы переменной длины (VLA) - расширения компилятора .

Однако массивы переменной длиныне допускается стандартом C ++. Использование такого расширения компилятора приведет к тому, что ваш код будет непереносимым и нестандартным.

Поскольку вы используете gcc, скомпилируйте ваш код с параметром -pedantic, и он сообщит вамэто не одобрено стандартом.

3 голосов
/ 18 февраля 2012

Нет необходимости в массивах переменной длины в C ++, потому что у него есть векторы.Просто замените

int p[i];

на

std::vector<int> p(i);

и все будет хорошо.

...