![](/img/trans.png)
[英]About memory allocation, does C malloc/calloc depends on Linux mmap/malloc or the opposite?
[英]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
,而地址558ae195c260
在stack
嗎? 第三,如果我對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.