我对程序在内存中的样子有点困惑,我的教授告诉我堆栈和堆相互增长,堆栈位于较低的内存地址。
该图像困扰我的第一件事是,如果堆从高到低增长,那么如果我在堆上分配了一个数组,那么指向第二个元素的指针的 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