如何判断堆栈是从上往下还是从下往上增长的
刚才自己想出了一个方法,代码如下,请各位指教:
- void StackTest()
- {
- int i = 0;
- int j = 0;
- int *pi = &i;
- int *pj = &j;
-
- if(pi < pj)
- cout<<"bottom up"<<endl;
- else
- cout<<"top down"<<endl;
- }
-
编译器其实也不能保证i一定就放在j的前面或者后面的……
如果真要判断的话用一下函数调用比较好:
- bool CompareStack(int *p)
- {
- int newInt;
- if(&newInt < p)
- return true; //地址递减
- else
- return false; //地址递增
- }
-
- bool GetStackOrder()
- {
- int oldInt;
- return CompareStack(&oldInt);
- }
编译选项里面要关掉inline
传递的参数是个指针,指向了上一级调用的局部变量。而这一级调用的局部变量在堆栈里肯定是堆在更上面的地方的。也就是说比较的是两层调用的局部变量的地址
如果局限于x86处理器的话,不用判断,一定是向低地址增长的,不受应用程序控制。
在X86平台linux下,用malloc等函数分配的内存的地址是向上增长的。而堆栈段(注意,堆栈是Stack,堆是Heap,不是同一个东西)地址是向下增长的。
要想判断也简单,汇编代码push一下,检查ESP寄存器的值是增加了,还是减少了。
要想判断也简单,汇编代码push一下,检查ESP寄存器的值是增加了,还是减少了。