Почему этот код не генерирует ошибку при использовании переменного размера массива?

Приведенный ниже код должен выдавать ошибку, поскольку компилятор не может узнать размер массива во время компиляции.

int f;
std::cin >> f;
int c[f];
c[100] = 5;

Я компилирую с помощью gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2, и он не просто компилируется, а работает как-то.

Как это случилось?

7

Решение

C99 принимает массивы переменной длины, а gcc принимает их как расширение в C90 и C ++.

С помощью -pedantic или же -Wvla превращает это в предупреждение в коде C ++, и -Werror=vla превращает это в ошибку.

13

Другие решения

C ++ не выполняет проверку границ массивов. line c[100] = 5; эквивалентно *(c + 100) = 5;, Вы просто указываете компилятору записывать в область памяти с определенным смещением от другой области памяти. Если вы введете в свою программу что-либо меньше 100, вы перезапишете некоторые данные в стеке. В зависимости от того, что делает остальная часть вашего кода, это может вызвать переполнение стека, «случайный» сбой, поскольку некоторые важные фрагменты данных будут перезаписаны, или он может работать правильно (а затем начать случайный сбой позже, когда какое-то внешне несвязанное изменение изменит макет памяти).

1

По вопросам рекламы [email protected]