我正在尝试确定一种方法来测试变量在堆栈中的位置(而不是按照常识进行)。
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/