自动变量/局部变量继续堆叠的方式,动态分配的对象/数据类型继续堆;分配了库函数调用(比如printf())的内存在哪里。在哪个部分?
答案 0 :(得分:5)
对于静态链接的程序,库代码与应用程序合并,几乎所有程序和库之间的区别都会丢失,即每个对象最终都在主程序中类似对象占用的相同部分中。
对于动态链接程序,如果一个对象是可写的而不是自动的,那么将在每个使用该库的进程中分配内存页面,并且仅为动态加载的库存在数据部分(或多个部分)。
自动变量在堆栈上以相同的方式分配给主程序,静态链接库函数和动态库。链接过程在此没有任何作用,相反,生成的代码只是从堆栈指针中减去每个例程的本地自动空间要求中的特定量。
本地静态变量由链接器以模块静态和全局地址的方式分配,它们只是没有全局可链接的名称。
最后,库例程将链接相同的malloc()
(或其他),因此所有堆分配将以相同的方式从同一组地址进行。
答案 1 :(得分:1)
库函数实际上并没有与你链接的其他模块区别对待:它们的局部变量使用堆栈,它们动态分配的内存部分在堆上。