欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-10 15:08:55
对于栈这种数据结构,大家应该不会陌生,它是一种后进先出的数据结构。在一般的计算机中,栈存在着两种存放数据的方式,一种是向上增长的,一种是向下增长的,如图1所示。 vc/ypc9wpg0kpha+1n...

对于栈这种数据结构,大家应该不会陌生,它是一种后进先出的数据结构。在一般的计算机中,栈存在着两种存放数据的方式,一种是向上增长的,一种是向下增长的,如图1所示。
查找栈的增长方向的分析及C代码实现vc/ypc9wpg0kpha+1nrnvdg1xchhkdbqo6zvu8rhz/ljz9t2s6s1xkosvltk/b7dqbbu06a1xlxy1rfqodpayv2+3uk21nomtcs12na3o7vu2s28mbxekgip1tcjrnw7ysfp8s/c1pazplxeo6y8tmr9vt1bttttprxetdjwt7tz09rk/b7dqrbu06a1xlxy1rehozwvcd4ncjxwpsthw7sjrm7sw8fu9dh5wlsy6b+0knfuusptw7pm0pip19s8usv5yrntw7xez7xns9bqtctvu7xe1pazple9z/k1vbxxyvtt2ste0rvw1styo78o16kjutxiysfo0sw8ylvu2s34yc+/tlw9tctsu7j2zsrm4qgjktwvcd4ncjxwps7sw8fwqrxao6zx986q0rvw1roj08o1xmr9vt294bm5o6zvu9b30qrtw9patoa3xbpm0plw0lxevtayv7hkwb+6zbqvyv21xmrkyouyzsr9oapex8o0o6zo0sphvs2/ydluyei8xtk7upazzndyo6zu2rpm0plw0m2ouf2xyl3pxlpsu7j2vtayv7hkwb+1xmewuvpbvbtotcs12na31rxatmxqts/vu7xe1pazple9z/kho8d708pv4rj2z+u3qlhg0lsz9sc0tcszzndyyofpwsv5yr6jujwvcd4ncjxwcmugy2xhc3m9"brush:java;"> /********************************************************************** * 版权所有 (c)2015, zhou zhaoxiong。 * * 文件名称:findstackdirection.c * 文件标识:无 * 内容摘要:查看栈的增长方向 * 其它说明:无 * 当前版本:v1.0 * 作 者:zhou zhaoxiong * 完成日期:20151202 * **********************************************************************/ #include // 重定义数据类型 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! ); } else if (&istackaddr < pstackaddr) // 第二次istackdirection的地址小于第一次istackdirection, 那么说明栈增长方向是向下的 { printf(stack grows down! ); } else { printf(bad stack! ); } } }

我们可以看到,函数findstackdirection中出现了递归调用,即首次进入该函数的时候,将istackaddr变量(局部变量)的地址值赋给pstackaddr,第二次进入该函数的时候,用新的istackaddr变量的地址值与第一次进入该函数时istackaddr变量的地址值相比较,如果前者大于后者,那么说明栈增长方向是向上的,否则,说明栈增长方向是向下的。

将以上代码上传到linux机器上,使用“gcc -g -o findstackdirection findstackdirection.c”命令对程序进行编译之后,运行“findstackdirection”命令,结果如下:

stack grows down!

即我所使用的系统中的栈的增长方向是向下的。大家也可以将以上代码在自己的系统中运行一下,看看结果是什么。

在大部分人(包括我)的印象中,栈的增长方向只有一种,那就是向上(如图1中的(a)),但程序运行出来的结果与我们预期的恰恰相反。从这点也可以看出,计算机系统在设计上的精妙与复杂,里面有很多东西都值得我们细细研究的。