我正在尝试确定一种方法来测试变量在堆栈上的位置(不做常识)。

   int main()
    {
      int i,j;
      return 0;
    }

声明int i确实没有区别; intj;和int i,j;我可以通过简单地指出地址来判断。我进入堆栈,然后j进入堆栈。但是无论如何,我可以使用内存地址运算符(或指针)告诉这个w / o。

这是一个特定的任务。大概是这样,我可以理解为什么以这种方式实现堆栈的原因。我可以轻松确定它们的位置(是的,它是特定于编译器的,但为简单起见,使用gcc)。

所以是的,我的意思是要在这里用困难的方式做事..弄清楚并演示为什么以及如何以特定方式实现堆栈

我可以添加更多的代码,更多的功能..等等..但是重点是要演示没有&的堆栈上的排序

最佳答案

因此,您想查找局部变量的地址而不使用专门设计用于查找变量地址的C运算符。为什么?

值得指出的是,在任何现代编译器/处理器组合中,如果不使用&运算符,则示例中的i和j可能不在堆栈中。即使您对它们进行了某些处理,以使编译器无法对其进行优化,它仍然可以选择将其放入寄存器中。

编辑:我已经读过您对datenwolf答案的评论,我想我知道您要什么。这是一个可能的答案,但我必须强调,我对您的编译器做出了很大的假设。尤其是,

  • 所有变量都存储在堆栈中
  • 尚未优化
  • 变量(请关闭编译器中的所有优化)。
  • 自动数组的
  • 存储空间直接在堆栈上分配
  • 函数调用之间不清除堆栈

  • 如果您具有这样的功能:
    int f()
    {
        int i = 1, j = 2;
        return 0;
    }
    

    您可以使用以下功能检查内存中i,j的顺序:
    void order()
    {
        int a[2];
        if (a[0] == 1)
        {
            printf("i first\n");
        }
        else
        {
            printf("j first\n");
        }
    }
    
    int main()
    {
        f();
        order();
        return 0;
    }
    

    切勿在真实代码中使用上述类似内容。它依赖于几项正式未定义的行为。

    关于c++ - 不使用(&)将变量放在堆栈上的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5141402/

    10-16 22:07