我正在编写一个在递归链末尾调用的函数。这个函数需要弄清楚它在被调用的时候在内存中的位置。代码如下:
void recover ()
{
int * x = (int *)&x;
}
问题是程序只是跳过这个语句,好像它从未写过。我在GDP中证实了这一点。你能想出为什么这条线被忽略的原因吗?
谢谢!
答案 0 :(得分:9)
将变量声明为volatile
。它应该阻止编译器优化。
volatile int * x = (int *)&x;
答案 1 :(得分:6)
如果您正在编译并启用了优化,则此代码可能会因为对程序没有影响而进行优化。使用-O0
选项。
答案 2 :(得分:4)
您编写的代码可能是未定义的行为,因为您将指向.g-dropdown{
max-height: 100px;
max-width: 75px;
overflow: scroll;
-webkit-transition: visibility 0.50s, height 0.50s;
-moz-transition: visibility 0.50s, height 0.50s;
transition: visibility 0.50s, height 0.50s;
}
.g-dropdown.visible{
visibility: visible;
height: 100px;
}
.g-dropdown.hidden{
visibility: hidden;
height: 0px;
}
的指针转换为指向<button id='trigger'>Click Me</button>
<ul id='select' style='padding: 0; margin: 0;'>
<li>One-one</li>
<li>Two-two</li>
<li>Three-three</li>
<li>Four-four</li>
<li>Five-five</li>
</ul>
<br/><br/><br/>
<button id='trigger2'>Click Me</button>
<ul id='select2' style='padding: 0; margin: 0;'>
<li>One-one</li>
<li>Two-two</li>
<li>Three-three</li>
<li>Four-four</li>
<li>Five-five</li>
</ul>
的指针强>
指针无法从概念上指向自身,因为您永远无法实现正确的间接级别。原因如下:
int
但是,int
是我能想到的唯一一种可能违反此规则的指针类型,但我不确定它是否符合标准是合法的。
我建议你写下面而不是你的内容:
Declaration | Type | Type after using the & operator
--------------------------------------------------------------
int x; | int | &x is an (int*)
int* x; | int * | &x is an (int**)
int** x; | int ** | &x is an (int***)
并编译它,没有像@ysap建议那样的优化。
仍然从你的例子中看起来你似乎想要找出堆栈顶部的位置,并且在装配中很容易完成。您需要做的就是读取堆栈指针。但是,这在C中并没有如此干净地暴露出来。虽然GCC对于类似的任务确实有一些helper functions,但我没有找到一个用于堆栈指针。
我个人会采用内联汇编,因为无论如何编写的内容都可能无法移植。
此外,如果我理解你的问题,那么它很可能是this question的副本,所以阅读这些答案也是值得的。
编辑:它应该等效于返回当前函数的 frame 的地址,这可以通过GCC builtin function __builtin_frame_address (unsigned int level)
linked earlier来完成。代码如下所示:
void*