您的位置:首页 > 其它

如何确定栈的增长方向地址是递增还是递减

2016-03-20 21:43 579 查看
#include<stdio.h>
static int stack_dir;
static void find_stack_direction (void)  {
static char   *addr = NULL;   /* address of first
`dummy', once known */
char     dummy;          /* to get stack address */

if (addr == NULL)
{                           /* initial entry */
addr = &dummy;

find_stack_direction ();  /* recurse once */
}
else                          /* second entry */
if (&dummy > addr)
stack_dir = 1;            /* stack grew upward */
else
stack_dir = -1;           /* stack grew downward */
}

int main(void)
{
find_stack_direction();
if(stack_dir==1)
puts("stack grew upward");
else
puts("stack grew downward");
return 0;
}


解释:过程中使用了递归,在第一次addr指向的是dummy变量的地址,递归时,会将dummy压栈,第二次的时候dummy的地址也会在栈里面,这时候比较前后两次压栈的地址,就能够知道栈中地址的增长方向是向上还是向下。

在内存管理中,与栈对应是堆。对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方式是向下的,是向着内存地址减小的方向增长。在内存中,“堆”和“栈”共用全部的自由空间,只不过各自的起始地址和增长方向不同,它们之间并没有一个固定的界限,如果在运行时,“堆”和 “栈”增长到发生了相互覆盖时,称为“栈堆冲突”,系统肯定垮台。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: