Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1469840
  • 博文数量: 213
  • 博客积分: 10418
  • 博客等级: 上将
  • 技术积分: 3358
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-09 23:49
文章分类

全部博文(213)

文章存档

2014年(1)

2013年(5)

2012年(11)

2011年(2)

2010年(8)

2009年(26)

2008年(160)

分类: LINUX

2009-11-16 16:42:13

在阅读wget源代码的过程中,发现一个用C语言实现,获得堆栈增长方向的巧妙方法
 
wget版本为1.11.4
 
函数位置:
 

$ pwd
/home/c-aries/source/wget-1.11.4/src
$ grep -n "^find_stack_direction" alloca.c
119:find_stack_direction ()
$


实现代码:

static void find_stack_direction ()
{
  static char *addr = NULL; /* Address of first `dummy', once known. */
  auto char dummy; /* To get stack address. */

  if (addr == NULL)
    { /* Initial entry. */
      addr = ADDRESS_FUNCTION (dummy);

      find_stack_direction (); /* Recurse once. */
    }
  else
    {
      /* Second entry. */
      if (ADDRESS_FUNCTION (dummy) > addr)
        stack_dir = 1; /* Stack grew upward. */
      else
        stack_dir = -1; /* Stack grew downward. */
    }
}


简化后的相关定义:

static int stack_dir; /* 1 or -1 once known. */

#define ADDRESS_FUNCTION(arg) &(arg)


find_stack_direction函数使用函数递归的方法
第一次进入,由于addr为NULL,所以将字符变量dummy的地址赋值给静态变量addr
第二次进入,由于静态变量addr已赋了值,所以进入 "Second entry."
接着,将第二次进入的dummy地址和第一次进入的dummy地址相比较
如果值为正,则堆栈向高地址增长;否则,堆栈向低地址增长

巧妙地运用了“函数递归也使用了堆栈”的思想 ,漂亮 :)

 


网络资源
1. wget源代码

阅读(2341) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~