c++ - 变量在堆栈上的位置 w/o 使用 (&)

标签 c++ c stack memory-management

我正在尝试确定一种方法来测试变量在堆栈中的位置(而不是按照常识进行)。

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

声明 int i 之间真的没有区别;整合;和 int i,j;我可以通过简单地计算地址来判断。 i 进入堆栈,然后 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++ - 变量在堆栈上的位置 w/o 使用 (&),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5141402/

相关文章:

无法编译c代码

c - 如何将循环中获得的 char 值追加到 String 中,以将其传递给 ShellExecute()?

android - 在gstreamer管道中使用encodebin

java - 创建不可变队列的问题

c++ - 绘制 vector <glm::vec3> opengl c++

c++ - c++中的三向条件确定两个数字的符号等价性

c++ - gcc - 如何检测基于指针的内存访问

c++ - 访问冲突写入位置未处理的异常

C++理解问题——链表和栈

使用堆栈和队列的 C++ 计算器