Этот вопрос имеет отношение к этому , касающемуся массивов переменной длины в C99, но отличается от него.
Ответы указывают на одну опасность с выделением массивов переменной длины (или просто больших массивовфиксированный размер) в стеке означает, что выделение может произойти сбой молча, в отличие от, скажем, вызова malloc
, который явно сообщает вызывающей стороне, успешно ли выделено.
Современные не встроенные платформы компиляции используют недопустимыйЗона памяти для обнаружения некоторых переполнений стека без дополнительных затрат (проверки - это только проверки, уже сделанные MMU бесплатно).Это не защищает на 100% от вышеуказанной проблемы, потому что очень большой локальный массив может заставить указатель стека перепрыгнуть через недопустимую область.
Кто-нибудь знает, сколько страниц обычно выделяется для этого обнаружения?Я думаю, это будет по крайней мере 4 КБ, но это может быть больше.Это выбор, сделанный компилятором или ОС, и в любом случае, есть ли способ изменить его?