dreamhead老大曾经讨论过这个问题,寻找一种可移植的方式来判断栈的增长方向,见《
栈的增长方向》。今天在读Ruby hacking guide第5章,介绍alloca函数的部分,提到ruby实现的C语言版本的alloca.c,读了下代码,发现这里倒是实现了一个很漂亮的函数用于实现判断栈的增长方向,利用了局部static变量,与dreamhead老大的想法其实是一致的。
#include
<
stdio.h
>
static void find_stack_direction( void );
static int stack_dir;
int main( void )
{
find_stack_direction();
if (stack_dir == 1 )
puts( " stack grew upward " );
else
puts( " stack grew downward " );
return 0 ;
}
static void find_stack_direction ( void )
{
static char * addr = NULL; /* address of first
`dummy', once known */
auto 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 */
}
static void find_stack_direction( void );
static int stack_dir;
int main( void )
{
find_stack_direction();
if (stack_dir == 1 )
puts( " stack grew upward " );
else
puts( " stack grew downward " );
return 0 ;
}
static void find_stack_direction ( void )
{
static char * addr = NULL; /* address of first
`dummy', once known */
auto 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 */
}
文章转自庄周梦蝶 ,原文发布时间2007-09-17