我们知道源文件在经过编译链接之后生成了目标文件,在映射完成后就开始执行,接下就是我们要谈的运行时内存管理。
有这么一道曾是腾讯面试时的题:
void add( void )
{
}
int main()
{
}
那么最后打印的结果是多少那?似乎一眼看去你会回答是10,但很遗憾正确答案是20,你或许会疑惑为什么a的值会改变,因为程序里似乎没有一个代码是给a直接赋值或间接赋值,接下来我会简单的讲解为什么a的值会改变。
程序在运行时所有的局部变量和函数都在栈上开辟内存,其他请求内存的函数如malloc等在堆上开辟,一般来说对的空间比栈大得多,栈的接口为esp,ebp寄存器,esp指向栈顶,ebp指向栈尾。用户可以向栈里面压入数据(push指令)每压入一个数据esp向上移动,也可已取出一个数据(pop指令),但是栈必须遵守一个规则,那就是先进后出。
这里要提出:栈保存类一个函数调用所需要的维护信息或活动记录
注意:地址从上而下为低到高
我们来讲解一个简单的程序来说明运行时内存管理:
#include
int add( int x, int y )
{
}
int main()
{