(此问题仅涉及逻辑地址)
我正在尝试一些代码,在其中打印出不同类型/范围的变量的地址,以更好地可视化过程映像。
当我打印出一些由malloc分配给堆的变量的地址,然后出于好奇而打印出printf函数的地址时,我感到困惑。
我发现与我的malloc分配变量相比,printf存储在堆上的地址更高(即更靠近堆栈)。这对我来说没有任何意义,因为我假设库函数将在运行任何其他指令之前先在运行时加载到堆上。我什至在所有malloc语句之前都放置了printf语句,以防库函数根据需要动态加载,但它没有任何改变。
谢谢。
答案 0 :(得分:3)
(此答案仅涉及Unix。我不知道Windows上的情况。)
大多数共享库在控制权到达main
之前就已加载到RAM中,并且肯定包含printf
的库。 dlfcn.h
中的函数可用于在程序执行期间加载更多共享库,这是最重要的例外。
如果您是说用来满足malloc
请求的内存区域,则从未将共享库作为“堆”的一部分加载。它们是使用系统原语mmap
加载的,可以放在内存中的任何位置。正如user3386109在对该问题的评论中指出的那样,在现代系统上,它们的位置intentionally randomized是各种漏洞利用的对策。