Я немного запутался в том, как программа выглядит в памяти, мои профессора сказали мне, что стек и куча растут навстречу друг другу, когда стек находится по более низкому адресу памяти.
Первое, что беспокоило меня с этим изображением, это то, что если куча выросла с высокой до низкой, то если я выделил массив в куче, разве указатель на второй элемент не должен быть меньше по значению int, чем указатель на первый элемент? что бы сбить с толку
Я провел небольшое исследование и наткнулся на эту цифру (обратите внимание, мой вопрос сосредоточен на Linux)
(источник: cyberplusindia.com)
Итак, данные и неинициализированные данные идут после сегмента текста и находятся в начале памяти программы, затем в куче, затем в стеке и, наконец, в аргументах командной строки и среде.
Но если размер стека возрастает от высоких адресов к низким, то как получится, если у меня в стеке будет выделен массив, указатель на первый элемент также будет иметь более низкое значение, чем указатель на второй элемент? не значит ли это, что стек тоже будет расти от низкого до высокого?
Итак, мой вопрос: какова правильная схема памяти для процесса в Linux? А также откуда берется память для разделяемой библиотеки (в адресном пространстве процесса)
Простой код с примерами указателей:
#include <iostream>
int data[5];
int main()
{
using std::cout;
using std::endl;
int stack = 0;
short *sptr = reinterpret_cast<short *> ( &stack );
int *iptr = new int[5];
cout << "Starting static tests"
<< "\nPointer to first element " << data
<< "\nPointer to second element " << &data[1]
<< "\nstarting stack test " << sptr
<< "\nsecond short " << &sptr[1]
<< "\nStarting heap test " << iptr
<< "\nsecond int " << &iptr[1];
delete[] iptr;
return 0;
}
Вывод:
Starting static tests
Pointer to first element 0x6013e0
Pointer to second element 0x6013e4
starting stack test 0x7fffdf864dbc
second short 0x7fffdf864dbe
Starting heap test 0x1829010
second int 0x1829014