Приведенный ниже код должен выдавать ошибку, поскольку компилятор не может узнать размер массива во время компиляции.
int f;
std::cin >> f;
int c[f];
c[100] = 5;
Я компилирую с помощью gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2, и он не просто компилируется, а работает как-то.
Как это случилось?
C99 принимает массивы переменной длины, а gcc принимает их как расширение в C90 и C ++.
С помощью -pedantic
или же -Wvla
превращает это в предупреждение в коде C ++, и -Werror=vla
превращает это в ошибку.
C ++ не выполняет проверку границ массивов. line c[100] = 5;
эквивалентно *(c + 100) = 5;
, Вы просто указываете компилятору записывать в область памяти с определенным смещением от другой области памяти. Если вы введете в свою программу что-либо меньше 100, вы перезапишете некоторые данные в стеке. В зависимости от того, что делает остальная часть вашего кода, это может вызвать переполнение стека, «случайный» сбой, поскольку некоторые важные фрагменты данных будут перезаписаны, или он может работать правильно (а затем начать случайный сбой позже, когда какое-то внешне несвязанное изменение изменит макет памяти).