Прежде всего, если вы хотите узнать, как устроен стек, кажется, что было бы намного проще запустить отладчик и посмотреть на стек в отладчике.
Предполагая, что по какой-то причине вы хотите продолжать писать программы для проверки их собственного состояния стека: вы перестали экспериментировать слишком рано.Программа, которую вы должны были написать:
Debug.WriteLine("{0:x16}",*(pB - 1));
Debug.WriteLine("{0:x16}",*(pB + 0));
Debug.WriteLine("{0:x16}",*(pB + 1));
, и тогда вы получили бы вывод
00000badf00dd00d <-- some pointer value
0000000000000002 <-- contents of b
0000000000000001 <-- contents of a
, и вы бы узнали, что стеки растут в направлении, противоположномВы думаете, что они делают .Во многих архитектурах загрузка чего-либо в стек уменьшает указатель стека.
Конечно, как уже указывали другие, мы не даем никаких гарантий относительно того, как вещи размещаются в стеке,или даже если вещи попадают в стек в первую очередь;локальные переменные могут быть помещены в кучу в некоторых ситуациях, и локальные переменные, адреса которых никогда не берутся, могут быть зарегистрированы.Например, что произойдет, если вы не берете адрес «а»?Это все еще заканчивается в стеке?Возможно, нет!