簡體   English   中英

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位(我有8 GB的內存,所以我仍然認為必須大於32位),但為什么它不能用64位表示,因為處理器是64位。

謝謝您的幫助。

不, p在堆棧(或全局)中,它指向堆中的一堆內存。

關於malloc() ,如果您使用的是操作系統,則取決於內核以及它如何管理內存。

最后,顯然您的某些數據是錯誤的。 32位總線數據不能管理8GB RAM(不超過2 ^ 32 = 4GB)。 但是,這在64位總線中是有意義的,因為64位變量具有足夠的空間來包含8GB地址。

Linux實現了ASLR ,據我所知,您總是會得到隨機地址。 558ae195c260實際上是通過malloc()在堆上分配的,而當您聲明int *p;時,則在堆棧上分配了7ffc0c53e3e0 int *p; 對於256 TB的RAM,48位仍然足夠,但除此之外,某些架構不允許所有地址線都為完整的64位(例如AMD64)。

希望能有所幫助。 如果我說的任何話是錯誤的或誤導性的,請在評論中糾正我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM