因此,从我之前的memmove问题中,我想知道如何找到堆栈增长的方向。
void stackDirection(int* i)
{
int j;
if(&j>i)
cout<<"Stack is growing up \n"<<endl;
else
cout<<"Stack is growing down \n"<<endl;
}
int main()
{
int i=1;
stackDirtection(&i);
}
答案 0 :(得分:13)
堆栈可能无法成长或下降。
每个堆栈帧都可以在堆内的随机点分配 这实际上是在几个操作系统中完成的,以防止恶意代码堆栈粉碎。
堆栈向堆增长的概念只是一种简单的方法来教授堆栈的概念(当然,早期的实现确实以这种方式工作,因为它很简单(没有必要比没有人更难做的事情)试图打破你))。
答案 1 :(得分:1)
这样的实验是不可靠的,因为你可以遇到异常。优化器可能会让您感到困惑,或者系统可能会使用寄存器来查找参数。如果您确实必须知道堆栈方向,请阅读处理器手册。
尽管如此,除非你正在编写一个操作系统或一些非常低级的东西,否则如果你需要了解堆栈方向,你可能会做一些丑陋和可怕的事情,并且应该重新考虑你的方法。
答案 2 :(得分:0)
你的函数依赖于int *参数,它可以指向任何地方,也是NULL。最好比较两个局部变量的地址。
答案 3 :(得分:0)
这超出了C ++标准的范围。它是一个实现定义的行为,可能取决于特定的OS /处理器架构等。
最好不要依赖或依赖这些细节,除非你进入ETHICAL黑客攻击:)和/或不太关注可移植性
答案 4 :(得分:0)
考虑以下重写,它揭示了编译器可以实现代码的一种方式:
void stackDirection(int * i) { struct __vars_stackDirection { int j; } * __ stackframe_stackDirection = malloc(sizeof(int));
if(&(__stackframe.j) > i)
cout<<"Stack is growing up \n"<<endl;
else
cout<<"Stack is growing down \n"<<endl;
}
int main()
{
struct __vars_main {
int i;
} * __ stackframe_main = malloc(sizeof(int));
stackDirection(&(__stackframe.i));
}
您必须同意__stackframe_stackDirection
和__stackframe_main
基本上是随机的。堆栈可以增长或减少。
更糟糕的是,你正在假设一个lineair模型。 a<b, b<a, or a==b
。a<b, b<a and a==b
。但对于指针来说,这并不成立。所有三个比较{{1}}可能同时为假。