系统栈的增长方向判断

函数调用时参数入栈,因此可以定义两个函数,分别输出参数地址,以此来确定栈的生长方向。

  1. //确定栈的生长方向  
  2. //自定义函数fun1() 和fun2(),其中fun1()内部调用fun2(),输出参数地址  
  3. #include<stdio.h>  
  4.   
  5. void fun2(int b) { printf("fun2: %ld\n", &b);}  
  6.   
  7. void fun1(int a) {   
  8.     printf("fun1: %ld\n", &a);  
  9.     fun2(a);  
  10. }  
  11. int main( ) {  
  12.   
  13.     int a = 1;  
  14.     fun1(a);  
  15.   
  16.     return 0;  
  17. }  

result:

[plain]  view plain copy print ?
  1. [scwangj@LB270107 cfd_simple]$ gcc -o hello hello.c  
  2. [scwangj@LB270107 cfd_simple]$ ./hello  
  3. fun1: 140735673261756  
  4. fun2: 140735673261724  
  5. [scwangj@LB270107 cfd_simple]$   
上述程序中,首先fun1被调用,参数a入栈;在fun1函数内部,先输出参数fun1函数的参数a的地址,然后调用fun2,fun2的参数b入栈;从结果来看,linux下栈的生长方向由高地址向低地址增长。




C在哪里会用到栈呢?稍微了解一点
等一下,怎么比较两个变量的地址呢?先声明的先入栈
那就函数加个参数,比较参数和局部变量的位置,参数肯定先入栈。那为什么不能局部变量先入栈?第一反应是怎么可能,但仔细想来又没有什么不可以。所以,这种方法也依赖于编译器的实现。
不妨回想一下,函数如何调用。执行一个函数时,这个函数的相关信息都会出现栈之中,比如参数、返回地址和局部变量。当它调用另一个函数时,在它栈信息保持不变的情况下,会把它调用那个函数的信息放到栈中。
比如,设计两个函数,一个作为调用方,另一个作为被调用方。被调用方以一个地址(也就是指针)作为自己的入口参数,调用方传入的地址是自己的一个局部变量的地址,然后,被调用方比较这个地址和自己的一个局部变量地址,由此确定栈的增长方向。
好了,既然有了这个了解,显然可以扩展一下前面的解决方案,可以两个栈帧内任意的东西进行比较,比如,各自的入口参数,都可以确定栈的增长方向。

int func1();

 int func(){

     int a =1;

     cout  <<  &a << endl;

     func1();

     return 0;

 }

 int func1(){

     int b =2;

     cout << &b << endl;

     return 0;

 }

同学说过操作系统中“栈从上向下增长,堆从下向上增长;栈的地址减小,堆的地址增加”;在网上也看到过这样的说法,现在验证一下看来在windowxp和visual studio2008下是正确的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值