С исторических времён повелось, что стек растет в этом направлении. При проектировании основными целями были оптимизация и экономия. Стек растет сверху вниз, а куча в в обратном направлении.
При объявлении через static const переменные лежат последовательно(случайно совпало?) друг за другом.
При объявлении через static переменные расположены рандомно(?)
bLercs, Так получилось. Вы другой версией компилятора и/или с другими опциями оптимизации запустите - можете получить другой результат.
Вообще, константы кладуться в отдельную секцию в исполняемом файле (.rodata, но это не точно) и вся эта секция загружается в память. Переменные же не лежат в экзешнике в основном, и выделяются при загрузке в исполняемого файла. Это довольно разные сценарии, поэтому ничего удивтельного, что там переменные по разному расположены.
bLercs, все так. Константы лежат не на стеке, также как и статические переменные.
Обычно, переменные со статическим временем жизни лежат в .bss или .rodata (в зависимости от константности)
Это неправильный ответ. Направление роста стека не связано напрямую с тем, как компилятор размещает на нём автоматические переменные. Вот пример, когда адреса не связаны с порядком объявления: https://godbolt.org/z/f6YWeW5s6
jcmvbkbc, в начале выполнения функции память выделяется не каждой переменной в отдельности, а сразу выделяется большой кусочек стека (в терминах GNU GCC называется stack slot), внутри которого компилятор уже и распологает переменные.
Dmitrii, спасибо, я знаю. Кроме того, это частный случай. В общем случае выделение пространства на стеке может происходить многократно в течение выполнения функции.
Однако, ещё раз, порядок размещения переменных языка высокого уровня в стеке не связан напрямую с направлением роста стека. Я привёл пример демонстрирующий это.
Правильный ответ на вопрос "почему адреса переменных расположены в таком порядке" -- "потому что так решил компилятор", вон он, ниже.
У компилятора нет силы воли и способности принимать решения. Распиши, пожалуйста, механизм, указавший компилятору выделять память под переменные именно в таком порядке. Или скажи, что почитать.