指向自己的指针C.

时间:2015-11-13 01:46:35

标签: c pointers

我正在编写一个在递归链末尾调用的函数。这个函数需要弄清楚它在被调用的时候在内存中的位置。代码如下:

void recover ()
{
     int * x = (int *)&x;
}

问题是程序只是跳过这个语句,好像它从未写过。我在GDP中证实了这一点。你能想出为什么这条线被忽略的原因吗?

谢谢!

3 个答案:

答案 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*