查找栈的增长方向的分析及C代码实现
2015-12-02 14:31
465 查看
对于栈这种数据结构,大家应该不会陌生,它是一种后进先出的数据结构。在一般的计算机系统中,栈存在着两种存放数据的方式,一种是向上增长的,一种是向下增长的,如图1所示。
图1 栈的两种增长方向
在图1的(a)中,栈是向上增长的,即数据A对应的地址小于数据B对应的地址;在图1的(b)中,栈是向下增长的,即数据A对应的地址大于数据B对应的地址。
那么,我们怎样来查看(最好用程序)自己所使用的系统中的栈的增长方向到底属于哪一种呢?(注:这是我偶然在网上看到的一个问题。)
我们知道,作为一种常用的数据结构,栈主要用于存放程序中的局部变量和函数的输入参数。那么,我们就可以设计一个程序,在程序中通过比较某一个局部变量的前后两次的地址值来判断栈的增长方向。利用这个想法编写出来的程序如下所示:
我们可以看到,函数FindStackDirection中出现了递归调用,即首次进入该函数的时候,将iStackAddr变量(局部变量)的地址值赋给pStackAddr,第二次进入该函数的时候,用新的iStackAddr变量的地址值与第一次进入该函数时iStackAddr变量的地址值相比较,如果前者大于后者,那么说明栈增长方向是向上的,否则,说明栈增长方向是向下的。
将以上代码上传到Linux机器上,使用“gcc -g -o FindStackDirection FindStackDirection.c”命令对程序进行编译之后,运行“FindStackDirection”命令,结果如下:
Stack grows down!
即我所使用的系统中的栈的增长方向是向下的。大家也可以将以上代码在自己的系统中运行一下,看看结果是什么。
在大部分人(包括我)的印象中,栈的增长方向只有一种,那就是向上(如图1中的(a)),但程序运行出来的结果与我们预期的恰恰相反。从这点也可以看出,计算机系统在设计上的精妙与复杂,里面有很多东西都值得我们细细研究的。
原文中的代码已提到了GitHub上,欢迎下载阅读:https://github.com/zhouzxi/FindStackDirection
图1 栈的两种增长方向
在图1的(a)中,栈是向上增长的,即数据A对应的地址小于数据B对应的地址;在图1的(b)中,栈是向下增长的,即数据A对应的地址大于数据B对应的地址。
那么,我们怎样来查看(最好用程序)自己所使用的系统中的栈的增长方向到底属于哪一种呢?(注:这是我偶然在网上看到的一个问题。)
我们知道,作为一种常用的数据结构,栈主要用于存放程序中的局部变量和函数的输入参数。那么,我们就可以设计一个程序,在程序中通过比较某一个局部变量的前后两次的地址值来判断栈的增长方向。利用这个想法编写出来的程序如下所示:
/********************************************************************** * 版权所有 (C)2015, Zhou Zhaoxiong。 * * 文件名称:FindStackDirection.c * 文件标识:无 * 内容摘要:查看栈的增长方向 * 其它说明:无 * 当前版本:V1.0 * 作 者:Zhou Zhaoxiong * 完成日期:20151202 * **********************************************************************/ #include <stdio.h> // 重定义数据类型 typedef unsigned char UINT8; typedef signed int INT32; // 函数声明 void FindStackDirection(void); /********************************************************************** * 功能描述:主函数 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:无 * 修改日期 版本号 修改人 修改内容 * --------------------------------------------------------------- * 20151202 V1.0 Zhou Zhaoxiong 创建 ***********************************************************************/ INT32 main() { FindStackDirection(); return 0; } /********************************************************************** * 功能描述:查找栈增长方向 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:无 * 修改日期 版本号 修改人 修改内容 * --------------------------------------------------------------- * 20151202 V1.0 Zhou Zhaoxiong 创建 ***********************************************************************/ void FindStackDirection(void) { UINT8 iStackAddr = 0; // 用于获取栈地址 static UINT8 *pStackAddr = NULL; // 用于存放第一个iStackAddr的地址 if (pStackAddr == NULL) // 第一次进入 { pStackAddr = &iStackAddr; // 保存iStackAddr的地址 FindStackDirection(); // 递归 } else // 第二次进入 { if (&iStackAddr > pStackAddr) // 第二次iStackDirection的地址大于第一次iStackDirection, 那么说明栈增长方向是向上的 { printf("Stack grows up!\n"); } else if (&iStackAddr < pStackAddr) // 第二次iStackDirection的地址小于第一次iStackDirection, 那么说明栈增长方向是向下的 { printf("Stack grows down!\n"); } else { printf("Bad stack!\n"); } } }
我们可以看到,函数FindStackDirection中出现了递归调用,即首次进入该函数的时候,将iStackAddr变量(局部变量)的地址值赋给pStackAddr,第二次进入该函数的时候,用新的iStackAddr变量的地址值与第一次进入该函数时iStackAddr变量的地址值相比较,如果前者大于后者,那么说明栈增长方向是向上的,否则,说明栈增长方向是向下的。
将以上代码上传到Linux机器上,使用“gcc -g -o FindStackDirection FindStackDirection.c”命令对程序进行编译之后,运行“FindStackDirection”命令,结果如下:
Stack grows down!
即我所使用的系统中的栈的增长方向是向下的。大家也可以将以上代码在自己的系统中运行一下,看看结果是什么。
在大部分人(包括我)的印象中,栈的增长方向只有一种,那就是向上(如图1中的(a)),但程序运行出来的结果与我们预期的恰恰相反。从这点也可以看出,计算机系统在设计上的精妙与复杂,里面有很多东西都值得我们细细研究的。
原文中的代码已提到了GitHub上,欢迎下载阅读:https://github.com/zhouzxi/FindStackDirection
相关文章推荐
- Java语言基础之管道流
- C#切割指定区域图片操作
- 关于The function get must be used with a prefix when a default namespace is not specified的错误
- eclipse中把多个项目放在一个work set下
- C++11 JNI开发中RAII的应用(一)--制作基础工具
- Jackson处理java对象,json,xml间转换
- PHP 文章实现内链
- Java Log4J 使用教程(java日志)
- Spring源码阅读之Bean加载(xml)1
- QtE4.6.3触摸屏隐藏鼠标指针的方法总结
- [Windows Server 2008] 查看ASP详细错误信息方法
- C# Socket的实现
- MATLAB入门教程
- java socket编程
- google地图找不到GoogleMaps/GoogleMaps.h的问题
- struts2的核心和工作原理
- hibernate tools自动生成entity代码
- thinkphp微信开发(消息加密解密)
- 获取java项目根目录
- 在Eclipse中创建Maven多模块工程的例子[转载]