| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 581 人关注过本帖
标题:问题,关于程序编译时,内存中栈的情况。
只看楼主 加入收藏
刮目相看
Rank: 2
等 级:论坛游民
帖 子:25
专家分:30
注 册:2009-11-23
结帖率:50%
收藏
 问题点数:0 回复次数:2 
问题,关于程序编译时,内存中栈的情况。
图片附件: 游客没有浏览图片的权限,请 登录注册


大家好,请问我画的这个图,有很多不完整的地方,请问程序编译时,栈里的情形是这样么?
首先是局部变量a,b,c进栈,如图,a压底,等等。那请问对这几个变量赋予的值存在栈上么?
然后遇到函数调用,我想应该是add函数的入口地址入栈?(我这个函数里面没有局部变量,如果有的话,是不是也依次进栈?)

函数调用结束后,add出栈,然后依次c,b,a。

这样的描述对么?感谢解答
搜索更多相关主题的帖子: 编译 内存 
2010-03-08 02:48
刮目相看
Rank: 2
等 级:论坛游民
帖 子:25
专家分:30
注 册:2009-11-23
收藏
得分:0 
刚刚接触这部分,难免说外行话,请不要见怪。
2010-03-08 02:53
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:0 
编译生成可执行文件时,局部变量(如main函数里的a,b,c)不进入文件,它们是在运行时创建在堆栈的,赋予它们的值当然在堆栈上了
并且堆栈是在程序运行的时候才有的,局部变量的相对位置你可以打印一下它们的地址就知道了
函数地址是一个全局量,编译好后就定下来了(它是一个相对量,即使是动态库,也能准确的找到相应的地址)

调用函数时,它会把函数地址放到一个叫做pc(它是定位程序下一个要执行的指令的位置的指针)的指针上,
把一些重要寄存器的值存放到堆栈上,包括下一条(即函数调用后的下一条指令地址,到时pc指针要用它返回到原来的程序空间)指令的地址,
这时,会把参数存入到相应的寄存器,如果参数太多的话,也是会存至栈上的,函数就运行在这个栈空间上,它的变量操作都在里面,
到函数返回时,返回值会存储在一个固定的寄存器里,并把原来调用函数前存储的寄存器值返回到相应寄存器,恢复sp(堆栈指针,与pc都是寄存器)与pc,
被调用的函数那段堆栈就会被以后程序执行冲掉。。。。
  
|堆|<--sp (调用前)--------------------------------------->sp在调用返回后也恢复
  | .
  | . ->一些寄存器的值与返回地址
  | .
|栈| .
  |<--sp (调用后)
  | .
  | . ->此函数使用的堆栈空间
  | .
  | .
  |---------------------返回后,原来存储的寄存器的值恢复,包括sp,pc

这个很不好表达,可能有疏漏,你可以看一下《C专家编程》,了解一下这方面的内容
2010-03-08 10:23
快速回复:问题,关于程序编译时,内存中栈的情况。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016726 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved