通过计算局部变量的地址差来判断栈是否向下增长

xyf*_*xyf 1 c memory

计算堆栈变量地址的差异是否不是确定堆栈是向上还是向下增长的方法?

int a;
int b;
printf ("Difference: %d\n", (&b - &a); // if > 0, stack grows downwards
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 5

撇开特定于实现的方面不谈,比较同一函数中局部变量的地址并不是确定堆栈是向上还是向下增长的好方法。这是因为该实现是内存中任意它认为合适的自由顺序变量。

但是,特定函数的堆栈帧中的变量通常会在一起,因此您可以通过将一个函数中的变量地址与被调用函数中的变量地址进行比较来实现这一点。例如:

void check_stack(void *ptr)
{
    int var;
    if (ptr) {
        if ((uintptr_t)&var > (uintptr_t)ptr) {
            printf("stack is growing up\n");
        } else {
            printf("stack is growing down\n");
        }
    } else {
        check_stack(&var);
    }
}
Run Code Online (Sandbox Code Playgroud)

并将该函数称为 check_stack(NULL);

另外,请注意,指针首先被强制转换为uintptr_t。这是因为在不相关的指针上使用关系运算符会调用未定义的行为。Auintptr_t是一种整数类型,保证能够保存转换后的指针值,并且比较的是那些值。