`

判断栈的增长方向

阅读更多
    dreamhead老大曾经讨论过这个问题,寻找一种可移植的方式来判断栈的增长方向,见《栈的增长方向》。 今天在读Ruby hacking guide第5章,介绍alloca函数的部分,提到ruby实现的C语言版本的alloca.c,读了下代码,发现这里倒是实现了一个很漂亮的函数用于 实现判断栈的增长方向,利用了局部static变量,与dreamhead老大的想法其实是一致的。
cpp 代码
 
  1. #include<stdio.h>  
  2. static void find_stack_direction(void);  
  3. static int stack_dir;  
  4. int main(void)  
  5. {  
  6.   find_stack_direction();  
  7.   if(stack_dir==1)  
  8.      puts("stack grew upward");  
  9.   else  
  10.      puts("stack grew downward");  
  11.   return 0;  
  12. }  
  13. static void find_stack_direction (void)  
  14. {  
  15.   static char   *addr = NULL;   /* address of first 
  16.                                    `dummy', once known */  
  17.   auto char     dummy;          /* to get stack address */  
  18.   
  19.   if (addr == NULL)  
  20.     {                           /* initial entry */  
  21.       addr = &dummy;  
  22.   
  23.       find_stack_direction ();  /* recurse once */  
  24.     }  
  25.   else                          /* second entry */  
  26.     if (&dummy > addr)  
  27.       stack_dir = 1;            /* stack grew upward */  
  28.     else  
  29.       stack_dir = -1;           /* stack grew downward */  
  30. }  
分享到:
评论
5 楼 Joo 2008-04-23  
rubynroll 写道
xombat 写道
请问什么情况下需要判断栈的增长方向?
估计做VM或解释器或调试器之类的东西吧...

也或者是像JProfiler支流的性能测试工具
4 楼 rubynroll 2007-12-24  
xombat 写道
请问什么情况下需要判断栈的增长方向?
估计做VM或解释器或调试器之类的东西吧...
3 楼 xombat 2007-09-28  
请问什么情况下需要判断栈的增长方向?
2 楼 mryufeng 2007-09-27  
有必要码?这样代码不好移植

专注 高性能 容错 分布服务器的实现(erlang)
http://mryufeng.iteye.com
1 楼 diogin 2007-09-19  
#include <stdio.h>
void f(void) {
    static int i = 0;
    int j = 1;
    if (i < 3) {
        ++i;
        printf("%x\n", &j);
        f();
    }
}
int main(void) {
    f();
    return 0;
}

相关推荐

    使用C语言判断栈的方向实例

    这一问题主要是如何判读出先后入栈的变量的地址大小,比如有a, b两个变量一先一后被定义,如果a的地址大于b的地址,则说明是以低地址方向增长的,反之,往高地址方向增长。在写C程序的时候不能简单直接的定义两个...

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

    为了查看栈的增长方向,我们可以设计一个程序,通过比较某一个局部变量的前后两次的地址值来判断栈的增长方向。下面是一个使用C语言编写的程序,用于查找栈的增长方向: ```c #include typedef unsigned char UINT...

    ST32堆栈增长方向及大小端测试

    在函数返回时,通过比较全局变量和局部变量的地址差异来判断堆栈的增长方向。如果局部变量的地址低于全局变量,那么堆栈是从高地址向低地址增长的。 - **大小端模式测试**:可以创建一个包含多字节数据的变量,如...

    C语言 栈的基本操作

    出栈操作首先判断栈是否为空,若非空,则取出栈顶元素,并将栈顶指针向栈底方向移动一位。 #### 获取栈顶元素 ```c Status GetTop(SqStack S, SElemType &e) { if (S.top == S.base) return ERROR; // 栈为空时不...

    栈_数据结构

    **影响栈算法的关键因素** 包括数组的隐含属性(起始下标和元素个数)、栈的生长方向、栈顶和栈底的定义以及如何判断栈是否为空或满。 **顺序存储栈的C++语言实现** 如下所示: ```cpp template void init_Stack(T...

    设计利用区域生长算法进行图像分割的程序.docx

    `listed`函数则用来判断栈中的点是否满足生长条件,并将符合条件的点移到另一栈中。整个程序通过循环和条件判断,不断进行种子点的查找和区域的生长,直至所有满足条件的像素点都被分配到相应的区域。 区域生长算法...

    设计利用区域生长算法进行图像分割的程序.pdf

    - 流程图描绘了算法的执行顺序,包括种子点的选择、区域生长、判断和栈的操作等步骤。 在实际应用中,区域生长算法的优点在于它可以灵活地适应不同的图像特性,并且效率较高。然而,它也有可能被局部极值所误导,...

    设计利用区域生长算法进行图像分割的程序 (2).pdf

    3. **区域生长**:从种子点开始,使用8连通性(上下左右及对角线方向)检查邻近像素。如果满足生长条件,这些像素被添加到当前区域,同时更新区域的平均值。这个过程持续进行,直到没有满足条件的邻近点为止。 4. *...

    数据结构课程总结..pdf

    栈的基本操作包括初始化、判断栈空、判断栈满、压栈、弹栈和获取栈顶元素。顺序栈在内存不足时可能出现“上溢”,而链栈没有这个限制。 总结来说,理解和掌握数据结构对于任何IT专业人员都至关重要,因为它们是构建...

    迷宫源代码,C语言的

    - **栈操作**:提供了一系列栈操作函数,包括初始化、销毁、清空、判断空、获取长度、入栈、出栈、获取栈顶元素以及遍历栈等。 - **迷宫探索**:`Pass` 检查当前位置是否可通行;`MarkPrint` 和 `FootPrint` 用于在...

    c语言迷宫程序,仅作参考,希望广大爱好者参与

    - `STACK_INCREMENT10`: 栈增长时每次增加的数量。 这些宏在程序中主要用于键盘事件的处理,使得程序能够识别用户的键盘输入。 ### 数据类型定义 程序中定义了几个自定义的数据类型,用于方便地操作迷宫和栈。 -...

    41浅谈增长渠道数据产品共15页.pdf.zip

    标题中的“41浅谈增长渠道数据产品共15页.pdf.zip”暗示了这是一个关于增长渠道和数据产品的专题讨论,可能包含15页的详细内容。...对于想要深入理解增长渠道和数据产品的人来说,这些都是重要的学习方向。

    一个迷宫小游戏代码 (C语言版)

    - `RANGE`, `STACK_INIT_SIZE`, 和 `STACK_INCREMENT` 定义为常量,分别用于迷宫的最大尺寸、栈的初始大小和栈增长时的增量。 #### 数据类型定义 - `Status` 和 `DirectiveType` 被定义为`int`类型,分别用于返回...

    分别基于区域生长和dnn神经网络对遥感图像中的河流进行提取python实现源码+项目说明.zip

    (1) 首先统计遥感图像的分布直方图,由于在一幅含有河流的遥感图像中河流部分的像素大多数相似,因此此时的分布直方图一定会出现峰值,对每个峰值进行检验,依据先验知识判断峰值像素是否就是属于河流,然后对属于...

    c++内存分配1

    栈的生长方向是向低地址,效率高,但空间有限,通常只有几兆字节。 2. 堆(Heap):程序员通过`malloc`和`free`(或者C++的`new`和`delete`)来手动分配和释放内存。堆空间可以很大,但分配和释放效率较低,且容易...

    C语言数据结构源代码

    源代码可能涵盖压栈、弹栈、判断栈空满以及遍历栈顶元素等功能。 这些源代码展示了C语言在实现常见数据结构时的灵活性和效率。通过学习和理解这些代码,开发者可以提升对数据结构的理解,提高解决实际问题的能力。...

    数据结构(c语言版)课后习题答案完整版.pdf

    题目中提到了如何利用栈判断一个字符序列是否为回文。方法是将一半字符入栈,然后逐个弹出并与未入栈的另一半进行比较,如果所有字符都相等,则是回文。队列的部分则涉及到循环队列的实现,包括插入(enqueue)和...

    数据结构期末考试题及答案.pdf

    5. **时间复杂度**:题目中给出了几个例子来判断时间复杂度,例如,嵌套循环的平方复杂度为O(n^2),两个独立循环的复杂度为O(n*m),以指数增长的循环为O(log3n)。 6. **数据结构的选择**:在设计数据结构时,需要...

    VC 贪吃蛇游戏源代码.rar

    3. **事件处理**:游戏循环检测键盘输入,根据用户的方向改变蛇的移动方向。 4. **数组和列表**:蛇的身体由一系列位置点表示,可能使用数组或链表存储。 5. **条件判断和循环**:蛇的移动、碰撞检测以及游戏结束...

Global site tag (gtag.js) - Google Analytics