Создать массив указателей на элементы обоих исходных массивов, упорядоченные по невозрастанию

Так ваши приспособления просто привели к UB и все. Массив у вас как был из одного элемента (или из двух, при сложении констант), так и остался. А что вы ввели в scanf вообще никак не повлияло. При этом имеем целых два UB: попытка изменения константного объекта и запись за пределы массива.

Добавлено через 10 минут

Кстати, хочу заметить, совершенно очевидно, что этот код собирался в MSVC как C++.

Если бы он собирался как C, то просто была бы ошибка компиляции. Потому что в MSVC нет поддержки VLA, а константные целочисленные переменные в С (в отличие от C++) не являются константами времени компиляции (объявить не-VLA-массив с их помощью нельзя).

Добавлено через 14 минут

Если кому-то интересна механика момента, то вот здесь:

фактически произошло раздвоение переменной на ее истинно константную и "неконстантную" части (это уже началось UB). На этапе компиляции эта переменная все еще считается константой, поэтому компилятор позволил объявить массив с ее помощью. Естественно этот массив имеет тот размер, который был указан при объявлении константы. А "неконстантная" часть стала требовать storage (т.е. проще говоря место на стеке), т.к. мы взяли ее адрес. Вот в этот storage scanf и записал значение.

И вот теперь, если мы выведем размеры (тег C++ поставил намеренно),

C++Выделить код

| | |
| --- | --- |
| 1 | printf("sizeof(arr1): %zu, n: %dn", sizeof(arr1) / sizeof(int), n); |

то увидим разные значения. Хотя, вы, очевидно, ждали совсем не этого.

В общем - не делайте так никогда.