C 共享库函数何时加载到堆中?

C 共享库函数何时加载到堆中?,c,memory,heap,C,Memory,Heap,(此问题仅涉及逻辑地址) 我正在试验一些代码,在这些代码中,我打印出不同类型/范围的变量的地址,以便更好地可视化流程图像 当我将地址打印到由malloc在堆上分配的几个变量上,然后出于好奇还打印printf函数的地址时,我产生了困惑 我发现printf存储在堆上比malloc分配的变量高得多的地址(即更靠近堆栈)。这对我来说没有意义,因为我假设库函数在运行时第一件事就是在执行任何其他指令之前加载到堆上。我甚至将printf语句放在任何malloc语句之前,以防库函数在需要时被动态加载,但这并没有

(此问题仅涉及逻辑地址)

我正在试验一些代码,在这些代码中,我打印出不同类型/范围的变量的地址,以便更好地可视化流程图像

当我将地址打印到由malloc在堆上分配的几个变量上,然后出于好奇还打印printf函数的地址时,我产生了困惑

我发现printf存储在堆上比malloc分配的变量高得多的地址(即更靠近堆栈)。这对我来说没有意义,因为我假设库函数在运行时第一件事就是在执行任何其他指令之前加载到堆上。我甚至将printf语句放在任何malloc语句之前,以防库函数在需要时被动态加载,但这并没有改变任何东西

谢谢。

(这个答案只涉及Unix。我不知道它在Windows上是怎样的。)

大多数共享库在控件到达
main
之前加载到RAM中,包含
printf
的库肯定会被加载。
dlfcn.h
中的函数可用于在程序执行期间加载更多共享库,这是最重要的例外


如果您指的是用于满足
malloc
请求的内存区域,那么共享库从未作为“堆”的一部分加载。它们是使用系统原语
mmap
加载的,可以放在内存中的任何位置。正如user3386109在对这个问题的评论中指出的那样,在现代系统中,它们的位置是各种利用漏洞的对策。

使用虚拟内存管理,没有理由对堆栈、堆和代码的地址有任何期望。事实上,它是专门为挫败预测地址关系的企图而设计的。