Почему программа требует константу?
Наверное стоит обратится к учебнику по Си почему именно так.
Изначально автоматические массивы в Си имели фиксированный размер, т.е. размер надо задавать константой. 
Отличие константы от обычной переменной - компилятор в процессе компиляции знает значение константы, а значение переменной нет. В процессе компиляции компилятор может сгенерировать команды для выделения памяти под массив.

Начиная с С99 (это такой стандарт Си от 1999 года) появились VLA (Variable Length Array). Синтаксис такой же как и у обычных массивов, но они могут иметь изменяемый размер, т.е. размер можно задавать обычной переменной. 
Использование VLA влечет дополнительные расходы времени выполнения, поэтому многие принципиально не используют эту возможность (например ядро Linux). И это вполне оправданно еще и потому, что память под VLA массивы выделяется на стеке, пространство стека ограничено, а вы с дуру можете там выделить слишком большой массив, что вызовет переполнение стека. 

Большинство компиляторов поддерживают VLA, но судя по ошибке, вы используете микрософтовский компилятор. Микрософт никогда не славилась поддержкой стандартов Си. VLA в ее компилятор не завезли до сих пор.
Потому, что массив "block" живет на стеке и компилятору надо знать его размер еще на этапе компиляции, чтобы правильно посчитать смещения. Если на этапе компиляции Вы не знаете сколько вам может потребоваться памяти, используйте malloc() для ее выделения в куче.