Главное нужно помнить, что память - она плоская, т.е. представляйте ее просто набором байт следующих друг за другом. И не важно, какие структуры вы в плоской памяти городите, трехмерные или пяти - они все должны отображаться на плоскую память.
Когда ОС загружает программу на выполнение она разделяет всю память, доступную процессу на 3 группы:
1. область куда загружается код программы. Обычно эта память помечается ОС только для чтения. И если туда будет попытка записи, то это вызовет исключение в процессоре.
2. Область стека. Адрес вершины стека записывается в регистр процессора. Когда в программе выделяются локальные переменные они помещаются именно в стек.
Фактически для помещения переменной в стек не надо выделять память. Компилятор при сборке программы считает смещения относительно начала стека и обращение к локальным переменным происходит по указателю на начало стека + смещение.
Со стеком интересная история: ОС выделяет под стек фиксированный размер памяти, но сам размер стека нигде не хранится (в явном виде не хранится, но его в можно узнать), хранится только указатель на начало. Поэтому всегда есть шанс переполнения стека. Например если сделать достаточно глубокую рекурсию.
В современных ОС под стек выделяется достаточно большой объем памяти, поэтому переполнений как правило не происходит. Но иногда для программы требуется больший объем стека, тогда нужный размер указывается с помощью опций компилятора, этот размер зашивается в исполняемый файл и когда загрузчик ОС грузит программу он считывает размер стека и выделяет нужную область памяти.
Если вы в своей программе столкнулись с переполнением стека, то не спешите выделять больший объем памяти для стека, возможно у вас программная ошибка из-за которой происходит переполнение.
3. Куча. Там выделяется память для динамических переменных. Память выделяется ОС по запросу. Обычно в своей программе вы используете менеджер кучи стандартной библиотеки, который в свою очередь обращается за выделением памяти к ОС. Менеджер кучи из стандартной библиотеки можно поменять, есть бесплатные свободно распространяемые реализации. Или сделать свой или пользоваться вызовами ОС для выделения памяти.
Как-то так.