Linux 的内存布局(C 中使用的 malloc(),但不是以预期地址开始)

Memory Layout of Linux (malloc() used in C, but does not start with the expected address)

我使用了这段代码:

    int
main(int argc, char *argv[])
{
    int *p;                   // memory for pointer is on "stack"
    p = malloc(sizeof(int));  // malloc'd memory is on "heap"
    assert(p != NULL);
    printf("(pid:%d) addr of p:        %llx\n", (int) getpid(), 
       (unsigned long long) &p);
    printf("(pid:%d) addr stored in p: %llx\n", (int) getpid(), 
       (unsigned long long) p);
    return 0;
}

然而,我得到:

addr of p:        7ffc0c53e3e0
addr stored in p: 558ae195c260

现在,首先,既然程序只做这个,我不明白为什么malloc()不是从地址00200000开始的?第二,我能说7ffc0c53e3e0地址在heap,地址558ae195c260stack吗?第三,如果我对 00200000 的猜测是错误的,我得到的地址是否有任何逻辑,还是完全随机的?

一想,地址连32位都不是,是48位。就算是32位以上(我有8GB内存,反正我觉得肯定是32位以上),为什么不用64位表示呢,既然处理器是64位的

感谢您的帮助。

不是,p在栈中(或全局),它指向堆中的一堆内存。

关于 malloc() ,如果您正在处理 OS,它取决于内核,以及它如何管理内存。

最后,显然你的某些数据是错误的。一个32bit的总线数据无法管理8GB的RAM(不超过2^32=4GB)。然而,这在 64 位总线中是有意义的,因为 64 位变量有足够 space 包含 8GB 地址。

Linux 实现了 ASLR,据我所知,您总是会得到随机地址。 558ae195c260 实际上是通过 malloc() 在堆上分配的,而当您声明 int *p; 时,7ffc0c53e3e0 是在堆栈上分配的。 48 位对于 256 TB 的 RAM 仍然足够,但除此之外,某些架构不允许所有地址线都是完整的 64 位(如 AMD64)。

希望对您有所帮助。如果我说的任何内容有误或误导,请在评论中纠正我。