Это беспокоило меня какое-то время. Это касается моего (отсутствия) понимания разницы между распределением статической и динамической памяти. Следующий массив представляет собой обычный статический массив, который должен означать выделение памяти во время компиляции, правильно? Тем не менее, я настроил его так, чтобы пользователь вводил размер массива во время выполнения.Массив статический, но размер массива не известен до времени выполнения. Как это возможно?
#include <iostream>
using namespace std;
int main() {
cout << "how many elements should the array hold? ";
int arraySize;
cin >> arraySize;
int arr[arraySize];
for (int i = 0; i < arraySize; ++i)
arr[i] = i * 2;
return 0;
}
Обратите внимание, что нет new
или delete
операторов в этой программе. Он отлично работает в Xcode 4.2 (компилятор Clang по умолчанию), а также в UNIX-сервере моей школы (GCC 4.4.5). Как компилятор знает, сколько памяти выделяется для arr
, когда массив создается во время компиляции? Это просто случайность моего компилятора, опасный код, который может повредить другую память, или это законно?
Это использует функцию под названием _variable длиной arrays_, который дебютировал в C99. –
Попробуйте выполнить компиляцию с помощью 'g ++ -Wall -Wextra -pedantic -std = C++ 98' –