如何判断堆栈是从上往下还是从下往上增长的

如何判断堆栈是从上往下还是从下往上增长的

刚才自己想出了一个方法,代码如下,请各位指教:

   
  1. void StackTest()
  2.  {
  3.     int i = 0;
  4.     int j = 0;
  5.     int *pi = &i;
  6.     int *pj = &j;
  7.  
  8.     if(pi < pj)
  9.         cout<<"bottom up"<<endl;
  10.     else
  11.         cout<<"top down"<<endl;
  12.  }
  13.  

编译器其实也不能保证i一定就放在j的前面或者后面的……
如果真要判断的话用一下函数调用比较好:

  
 
     
  1. bool CompareStack(int *p)
  2. {
  3.     int newInt;
  4.     if(&newInt < p)
  5.         return true;         //地址递减
  6.     else
  7.         return false;        //地址递增
  8. }
  9. bool GetStackOrder()
  10. {
  11.     int oldInt;
  12.     return CompareStack(&oldInt);
  13. }

编译选项里面要关掉inline

传递的参数是个指针,指向了上一级调用的局部变量。而这一级调用的局部变量在堆栈里肯定是堆在更上面的地方的。也就是说比较的是两层调用的局部变量的地址


如果局限于x86处理器的话,不用判断,一定是向低地址增长的,不受应用程序控制。
在X86平台linux下,用malloc等函数分配的内存的地址是向上增长的。而堆栈段(注意,堆栈是Stack,堆是Heap,不是同一个东西)地址是向下增长的。
要想判断也简单,汇编代码push一下,检查ESP寄存器的值是增加了,还是减少了。

你可能感兴趣的:(如何判断堆栈是从上往下还是从下往上增长的)