将int自己的地址分配给其值

时间:2013-11-11 19:41:16

标签: c++ c

下面的代码是未定义的行为,实现是由标准定义还是定义的? 我找不到有关将整数分配给自己的地址的任何参考。

volatile int x = (int)&x;

此代码转换为:

lea         eax,[ebp-4]  
mov         dword ptr [ebp-4],eax 

3 个答案:

答案 0 :(得分:21)

在C中,在声明和初始化中使用x都可以:

  

(C99,6.2.1p7)“[...]任何其他标识符的范围都在其声明者完成之后开始。”

指针转换为整数的结果是实现定义的,可以是未定义的行为:

  

(C99,6.3.2.3p7)“任何指针类型都可以转换为整数类型。除了先前指定的,结果是实现定义的。如果结果不能用整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。“

答案 1 :(得分:12)

在C ++中,根据point of declaration rule。它定义明确。因为在=之前,声明变量x,然后知道&x。 这是一个棘手的问题,下面的代码是未定义的行为

int x = x;        // undefined behavior, using uninitialized variable

但是...

int x = (int)&x;  // defined behavior

我在谈论C ++,但我相信它对C也有效。

答案 2 :(得分:2)

在您显示的ASM代码中,首先将指针的值放入eax,然后从eax读取指针并将其放入与整数值相同的位置是

这里唯一的问题是int并不总是与int*相同。在我的64位机器上,int是4个字节,指针是8个字节。如果我在我的盒子上运行你的代码,我只会获得指针的一半。