判断栈的增长方向

  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 */
}

文章转自庄周梦蝶  ,原文发布时间2007-09-17

时间: 2024-11-05 20:36:03

判断栈的增长方向的相关文章

内存管理-堆、栈的地址高低? 栈的增长方向?

问题描述 堆.栈的地址高低? 栈的增长方向? 程序员的自我修养>说栈的地址比堆高,栈是向下增长的,堆是向上增长的. #include #include int main(){using namespace std;double a0[4] = {1.2 2.4 3.6 4.8};double a1[4] = {1.2 2.4 3.6 4.8};vector a2(4);vector a3(4);a2[0] = 1.0/3.0;a2[1] = 1.0/5.0;a2[2] = 1.0/7.0;a2[

查找栈的增长方向的分析及C代码实现

对于栈这种数据结构,大家应该不会陌生,它是一种后进先出的数据结构.在一般的计算机系统中,栈存在着两种存放数据的方式,一种是向上增长的,一种是向下增长的,如图1所示. 图1 栈的两种增长方向 在图1的(a)中,栈是向上增长的,即数据A对应的地址小于数据B对应的地址:在图1的(b)中,栈是向下增长的,即数据A对应的地址大于数据B对应的地址. 那么,我们怎样来查看(最好用程序)自己所使用的系统中的栈的增长方向到底属于哪一种呢?(注:这是我偶然在网上看到的一个问题.) 我们知道,作为一种常用的数据结构,

浅谈C语言函数调用参数压栈的相关问题_C 语言

参数入栈的顺序 以前在面试中被人问到这样的问题,函数调用的时候,参数入栈的顺序是从左向右,还是从右向左.参数的入栈顺序主要看调用方式,一般来说,__cdecl 和__stdcall 都是参数从右到左入栈. 看下面的代码: #include <stdio.h> int test(int a, int b) { printf("address of a %x.\n", &a); printf("address of b %x.\n", &b)

Linux程序存储结构与进程结构堆和栈的区别【转】

转自:http://www.hongkevip.com/caozuoxitong/Unix_Linux/24581.html 红客VIP(http://www.hongkevip.com):Linux程序存储结构与进程结构堆和栈的区别   摘要:本文主要讲述了Linux系统中,程序存储结构(代码区.数据段和BBS区)与进程的基本结构(代码区.数据段.BBS区.堆和栈),以及堆和栈的区别. Linux程序存储结构与进程结构 1.Linux程序存储结构 在Linux系统下,程序是一个普通的可执行文件

浅谈缓冲区溢出之栈溢出&lt;上&gt;

有段时间没有用windows了,刚一开机又是系统补丁更新.匆匆瞥了一眼看到了"内核缓冲区溢出漏洞补丁"几个字眼.靠,又是内核补丁.打完这个补丁后MD的内核符号文件又得更新了.于是抱怨了几句,一旁的兄弟问什么是缓冲区溢出.这个-三两句话还真说不清楚.解释这个问题用C语言比较方便,但是单从C代码是看不出来什么的,具体原理要分析机器级代码才能说清楚.既然是浅谈原理,那就从最基本的开始吧. 本文的定位是对此方面一无所知的读者,所以大牛们可以直接飘过- 缓冲区溢出这个名词想必大家并不陌生吧,在微

递归与尾递归(C语言)

在计算机科学领域中,递归式通过递归函数来实现的.程序调用自身的编程技巧称为递归( recursion). 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合. 一般来说,递归需要有:边界条件.递归前进段和递归返回段. 当边界条件不满足时,递归前进:当边界条件满足时,递归返回.

展示C代码覆盖率的gcovr工具简介及相关命令使用示例

(本人正在参加2015博客之星评选,诚邀你来投票,谢谢:http://vote.blog.csdn.net/blogstar2015/candidate?username=zhouzxi) 最近,因为要展示某项目的单元测试的代码覆盖率,我无意间在网上找到了gcovr工具.使用之后,觉得这个工具相当的不错,于是便写下这篇文章,可供相关的开发人员参考. 简而言之,gcovr是一个将单元测试中的代码覆盖率以多种方式(包括列表方式.XML文件方式.HTML网页方式等)展示出来的工具,目前最新的版本是3.

Linux下进程内存管理之malloc和sbrk

之前自己突发兴趣想写一下malloc函数,顺便了解一下进程的内存管理.在写的过程中发现其实malloc只不过是通过调用Linux下的sbrk函数来实现内存的分配,只是在sbrk之上加了一层对所分配的内存的管理罢了,而sbrk以及brk是实现从虚拟内存到内存的映射的.在实际动手写之前先来了解一下Linux下一个进程的内存空间分配. 进程内存空间分配 Linux下每个进程所分配的虚拟内存空间是3G,但实际使用过程中不可能也没有必要为一个进程分配如此大的空间,毕竟内存是很宝贵的资源.当一个进程执行的时

Linux从程序到进程

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   计算机如何执行进程呢?这是计算机运行的核心问题.即使已经编写好程序,但程序是死的.只有活的进程才能产出.我们已经从Linux进程基础中了解了进程.现在我们看一下从程序到进程的漫漫征程.   一段程序 下面是一个简单的C程序,假设该程序已经编译好,生成可执行文件vamei.exe. #include <stdio.h> int glob=0; /*global variabl