栈的增长方向

来源:互联网 发布:地板防滑垫淘宝网 编辑:程序博客网 时间:2024/04/29 03:49

为何栈上内存的分配都是从高到低?即栈的增长方向为何从大到小??(这是人为规定,还是有讲究的)  
  如:  
  ...  
  int   i=0;  
  int   j=0;  
  ...  
  32位系统下  
  如果&i=FFFFF4,那么&j=FFFF0(呵呵,只是举例,没有实际根据) 问题点数:100、回复次数:25Top

1 楼kisscpp(玉笛谁家听落梅)回复于 2002-07-21 17:46:54 得分 0

不好意思更正一下  
  ...  
  如果&i=FFFFFFF4,那么&j=FFFFFFF0Top

2 楼glassshark(★★★★★★)回复于 2002-07-21 17:54:37 得分 10

在X86体系中,栈是向下生长的,入栈指令将使栈指针向向下,而出栈将使栈指针增长,当然你可以构造非系统堆栈,它不受出入栈影响,你可以自行规定 向上或向下增长,不过一般都遵循系统的默认规范。而且这样设置是有道理的,因为栈其实是可以无限增长的,除非你自行检查,不然不会发现栈溢出,所以数据 区,代码区都是由下向上执行的,而堆栈是由上向下增长的,向对开的列车,留下了充分的空间,减少了相遇的可能。Top

3 楼giantzz(平庸无能的政府)回复于 2002-07-21 17:58:09 得分 5

就是这么规定的Top

4 楼hqw(让我试试)回复于 2002-07-21 17:58:29 得分 5

我看从大到小,从小到大都没什么本质区别,应该是规定吧?Top

5 楼Paul_Ni(龙舌兰)回复于 2002-07-21 18:03:12 得分 0

你就记得得了,哪来这么多问题。Top

6 楼hqw(让我试试)回复于 2002-07-21 18:05:22 得分 10

to   glassshark(glassshark)    
  windows上堆地址大于栈地址,堆和栈相背发展。作何解释?Top

7 楼Euphrates(幼发拉底河)回复于 2002-07-21 18:17:54 得分 10

这是一个implementation-define的东东,不同的平台下面的做法不一定相同Top

8 楼keenhaung(keen)回复于 2002-07-21 18:30:34 得分 0

upTop

9 楼N3t9h0st(rm / -rf)回复于 2002-07-21 18:37:16 得分 5

系统分配堆栈是有一定大小限制的,所以上下并不重要.Top

10 楼glassshark(★★★★★★)回复于 2002-07-21 18:46:12 得分 5

》》windows上堆地址大于栈地址,堆和栈相背发展。作何解释?  
  虚地址,并非物理内存地址,未必是真正的大于,背对背更安全,不容易互相覆盖,防止下溢即可。Top

11 楼Kiloy(千逸)回复于 2002-07-21 20:39:22 得分 5

从8086继承而来。Top

12 楼hcpp(简单的才是美的)回复于 2002-07-22 08:53:47 得分 5

KissCpp:看了这么多人的回答,我都不是十分认同。Top

13 楼sudaobo()回复于 2002-07-22 16:55:29 得分 5

glassshark说的是有道理的,栈的增长方向是有CPU的硬件决定的,PUSH指令就是使堆栈指针减4。Top

14 楼yejin13(:::13:::)回复于 2002-07-22 19:05:29 得分 5

栈的增长方向是有CPU的硬件决定的,x86商战的增长方向是有高地址到低地址  
  你不妨看看vc里的汇编代码,以及mem窗口就知道了。Top

15 楼dancerindark(麦田里守望者)回复于 2002-07-22 19:42:24 得分 5

cpu硬件决定!没什么好讲的!Top

16 楼awinder(风)回复于 2002-07-22 22:01:56 得分 5

cpu硬件决定,有的risc   cpu就是上增长的Top

17 楼ameba(ameba)回复于 2002-07-23 05:54:38 得分 5

硬件还不是由人规定的Top

18 楼ckc(火)回复于 2002-07-23 07:55:04 得分 10

没什么讲究,就是人为规定的。  
  同样是intel出的cpu,象51系列栈就是向上增长的  
  不过我同意glassshark(glassshark)   的看法  
  栈和数据定义如果方向相反的话要方便一点  
  这一点在做51编程的时候有亲自感受,  
  51的片内内存本来就很小,就感觉不好安排,再加上你定义的数据只能从低到高定义(当然,你硬性指定高地址位也可以,但是这样就失去了灵活性)对栈初值的选择就有点麻烦。  
  所以做51的程序时就在想,为什么它不象X86系列这样栈从高到低啊Top

19 楼hcpp(简单的才是美的)回复于 2002-07-23 12:57:16 得分 0

up   you.Top

20 楼hellwolf(地狱狼)(活着)(死磕)回复于 2002-07-23 13:31:54 得分 5

cpu的sp指针在程序载入时,值最大(即栈顶),用减法来移动堆栈指针,可以防止越界(毕竟加法可以一直加,直到寄存器到顶,可是堆栈没有那么大)Top

21 楼kisscpp(玉笛谁家听落梅)回复于 2002-07-24 10:21:24 得分 0

呵呵,谢谢各位的解释。小弟之所以问这个可能比较幼稚的问题,主要是  
  最近学c发现一个有意思的问题如下:  
  ...  
  int   i=0;  
  char   a[]="imisshua";  
  int   j=0;  
  ...  
   
  发现它的内存分配顺序为:  
  i  
  a[8]  
  a[7]  
  ...  
  ..  
  a[1]  
  a[0]  
  j  
   
  而不是我当时认为的:  
  i  
  a[0]  
  a[1]  
  ...  
  ..  
  a[7]  
  a[8]  
  j  
  和同学讨论,大家觉得可能是因为为了&a[0]<&a[1]<...<&a[8],这样当char*p=a;p++会指到a[1],比较符合习惯。  
  (如果大家有更好的解释,请就贴到这!)但又细想后觉得,如果栈本身从低到高分配,分配顺序还为  
  i  
  a[0]  
  a[1]  
  ...  
  ..  
  a[7]  
  a[8]  
  j  
  那么既&a[0]<&a[1]<...<&a[8],又char*p=a;p++会指到a[1],不更符合习惯思维吗??  
  所以就有了这个比较幼稚的问题!  
   
  Top

22 楼hcpp(简单的才是美的)回复于 2002-07-30 14:51:36 得分 0

up   you.Top

23 楼giantzz(平庸无能的政府)回复于 2002-07-30 15:58:12 得分 0

你也可以定义堆栈向高地址增长,但是C好象不可以 
原创粉丝点击