C语言:关于程序运行时的内存管理

本文探讨了C语言程序运行时的内存管理,包括栈和堆的分配,以及函数调用时的内存布局。通过分析示例代码和反汇编,解释了局部变量如何在栈上分配,以及如何通过地址位移间接修改其他变量的值,揭示了内存管理的底层原理。
摘要由CSDN通过智能技术生成


  我们学习C语言时,不要只仅仅只会写代码,我们要去了解一些更底层的知识,去明白机器在我们按下编译,执行按钮后干了什么,明白这些对我们以后的学习更有帮助以及在处理一些问题为我们提供思路。

我们知道源文件在经过编译链接之后生成了目标文件,在映射完成后就开始执行,接下就是我们要谈的运行时内存管理。

有这么一道曾是腾讯面试时的题:

void add( void )

{

     int tmp = 0;

     int *p = (int *)*( &tmp + 1 );

     *(p - 1) = 20;

}

 

 

int main()

{

   int a = 10;

   add( );

   printf("%d",a);

   return 0;

那么最后打印的结果是多少那?似乎一眼看去你会回答是10,但很遗憾正确答案是20,你或许会疑惑为什么a的值会改变,因为程序里似乎没有一个代码是给a直接赋值或间接赋值,接下来我会简单的讲解为什么a的值会改变。

程序在运行时所有的局部变量和函数都在栈上开辟内存,其他请求内存的函数如malloc等在堆上开辟,一般来说对的空间比栈大得多,栈的接口为esp,ebp寄存器,esp指向栈顶,ebp指向栈尾。用户可以向栈里面压入数据(push指令)每压入一个数据esp向上移动,也可已取出一个数据(pop指令),但是栈必须遵守一个规则,那就是先进后出。

这里要提出:栈保存类一个函数调用所需要的维护信息或活动记录

C语言:关于程序运行时的内存管理

注意:地址从上而下为低到高

我们来讲解一个简单的程序来说明运行时内存管理:


#include

 

int add( int x, int y )
{
 int tmp = 0;
 tmp = x + y;
 return tmp;
}


int main()
{
 int a = 10;
 int b= 20;
 int c = 0;
 c = add( 10, 20 );
 printf("%d",a );

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值