C计划找到堆栈增长方向[英] C program to find direction of stack growth

本文是小编为大家收集整理的关于C计划找到堆栈增长方向的处理方法,想解了C计划找到堆栈增长方向的问题怎么解决?C计划找到堆栈增长方向问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我如何在C中找到堆栈是向前还是反向方向发展?这个可以吗?

int j = 0;
int k = 0;

if (&k > &j) 
 printf ("Stack is growing in forward direction");

else if (&k < &j) 
  printf ("Stack is growing in reverse direction");

推荐答案

要可靠,必须找到两个函数调用之间的区别.

void func(int *p) {
    int i;
    if (!p)
        func(&i);
    else if (p < &i)
        printf("Stack grows upward\n");
    else
        printf("Stack grows downward\n");
}

func(NULL);

请注意,这不会给您有关 c 的答案,但是关于您的编译器.

其他推荐答案

您不能.在您的代码中,(&k > &j)调用未定义的行为.除非指示器指向同一数组中的对象(或一个超出数组末端的一个对象,否则指定与关系运算符的指针比较.

.

您的实施是否存在堆栈.未定义的行为无法预测实施细节.

ISO C标准即使一次也不会提及"堆栈"一词.堆栈可能甚至不存在.功能调用用来保留本地变量的内存甚至可能不连续.

其他推荐答案

这不是在C中易于确定的特征,因为您的编译器可能会执行各种优化,以破坏此类测试.您可能会更好地使用汇编功能.

换句话说,您的功能可以工作,但不确定.如果它不起作用,它将不会报告错误:相反,您将获得不正确的结果,并且无法分辨.堆栈和呼叫惯例的处理是C hist of的唯一两个低级事物.

我的x86汇编器是生锈的,但是在我的头上,这个(英特尔语法)汇编功能可以给出正确的结果.它的C原型为int getGrowthDirection();如果堆栈向前增长,它将返回一个正数,如果堆栈在反向方向上生长,则返回一个负数.

getGrowthDirection:
    mov ebx, esp
    push esp
    sub ebx, esp
    xor eax, eax
    sub eax, ebx
    pop esp
    ret

请注意,此功能几乎是无用的,因为汇编要求您知道要定位的平台,如果您知道要定位的平台,那么您应该知道堆栈增长方向.

本文地址:https://www.itbaoku.cn/post/359129.html