转载:http://blog.chinaunix.net/uid-2413049-id-109836.html

在阅读wget源代码的过程中,发现一个用C语言实现,获得堆栈增长方向的巧妙方法

wget版本为1.11.4

实现代码:

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地址相比较
如果值为正,则堆栈向高地址增长;否则,堆栈向低地址增长

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

转载于:https://www.cnblogs.com/pengdonglin137/articles/4620576.html

C语言,获得堆栈增长方向的一种方法相关推荐

  1. linux中复制字符串出错,C语言实现字符串的复制的两种方法

    本文将要为您介绍的是C语言实现字符串的复制的两种方法,具体操作方法: 利用数组实现 1 #include 2 #include 3 4 void copy_string(char str1[],cha ...

  2. c语言中字符串去掉逗号,JS四种方法去除字符串最后的逗号

    window.οnlοad=function() { var obj = {name: "xxx", age: 30, sex: "female"};//定义一 ...

  3. python语言入门自学-自学编程的6种方法,自学Python

    随着互联网日趋迅猛,编程已经在我们生活当中无处不在了.众所周知,程序员的工资都很不错,于是越来越多的人,都想加入到编程的行业中来.那么如何加入到程序员的行业当中? PHP从入门到放弃,C语言从入门到放 ...

  4. c语言能返回字符串吗,C语言中函数返回字符串的四种方法

    在讨论着四种方法以前,首先要对函数有一个简单的认识,不管是在形实结合时,仍是在return语句返回时,都有一个拷贝的过程.你传进来的参数是个值,天然函数在工做以前要把这个值拷贝一份供本身使用,你传进来 ...

  5. 懒人修仙传ce修改方法_盘点《西游记》中增长寿命的6种方法,其中长生不老的方法有三种...

    长生不老是每个人梦寐以求的事情,古代那么多皇帝没事就请道士来炼丹,不就是希望自己能长生不老么,结果不仅没长生不老,反而因丹毒而英年早逝.而这种思想,也是深深的影响着诸多小说,比如<西游记> ...

  6. 易语言运行执行exe文件的三种方法

    易语言一个很初级的问题 ,如何运行exe文件,可以进行游戏的一键启动,软件的一键启动,方便控制操作. 1.和程序同目录 如果你要运行和你程序同目录下的 "****.exe",就用下 ...

  7. C语言中字符数组初始化的几种方法

    欢迎关注我的微信公众号:CurryCoder的程序人生 1.C语言中的字符数组初始化 在C语言中,字符串是当做字符数组来处理的:所以字符串有两种声明方式,一种是字符数组,一种是字符指针. 1.1 直接 ...

  8. 二分法求解方程的根java_C语言二分法求解方程根的两种方法

    本文实例为大家分享了C语言二分法求解方程根的具体代码,供大家参考,具体内容如下 对于二分法求根,其实和弦截法思想很像,甚至更简单. 原理:先看如下的图 A,B两个点为跟的一个边界,通过一直缩小跟的边界 ...

  9. java实现c语言的函数_C语言实现返回字符串函数的四种方法

    前言 C语言返回字符串函数共有四种方式,分别如下: 使用堆空间,返回申请的堆地址,注意释放 函数参数传递指针,返回该指针 返回函数内定义的静态变量(共享) 返回全局变量 下面来看看详细的介绍 其实就是 ...

最新文章

  1. ❤️手撕这十道HiveSQL题还不能吊打面试官,却能保你不被吊打❤️【推荐收藏】
  2. 打包解决方案后,安装时提示只能在IIS5.1以上运行解决方法
  3. 【django轻量级框架】用Mysql的各种项目响应速度慢?一招解决!
  4. 2-29 while
  5. boost::depth_first_search用法的测试程序
  6. UDLD(Unidirectional Link Detection)
  7. poj3723Conscription
  8. 如何在Java中将图像上传到DropBox
  9. 职场七种最致命的想法
  10. css删除li 圆点_CSS中li圆点样式
  11. 用ZK UI解决storm 读取Kafka时的Fetch offset *** is out of range for topic , resetting offset
  12. python 单因子方差分析_假设检验之F检验-方差分析
  13. linux 命令 dd 详解
  14. 刻意学习:持续行动让你人生逆袭
  15. php 量化交易 开源,hikyuu开源量化交易研究框架 v1.0
  16. kelvin 四线连接电阻测试法
  17. 数据可视化项目【三】数据切换效果模块
  18. 【算法】阿里精准推广的核心算法MLR
  19. 微信小程序消息推送、接收消息事件、发送客服消息
  20. 文章管理系统 -- Express学习

热门文章

  1. 将 Mac 直接连接到 Windows 电脑
  2. 六种微服务架构的设计模式
  3. 关于重构,看此文就够了
  4. 阅读开源源码的正确姿势建议
  5. Java 必看的 Spring 知识汇总!
  6. TiDB 官方设计文档翻译(一)
  7. Android: RecyclerView.ViewHolder、Adapter
  8. 网络:301和302
  9. JPA_@Table 注解详解
  10. 成功解决VM虚拟机内This compute has only 713.3MB disk space remaning