下面的代码是未定义的行为,实现是由标准定义还是定义的? 我找不到有关将整数分配给自己的地址的任何参考。
volatile int x = (int)&x;
此代码转换为:
lea eax,[ebp-4]
mov dword ptr [ebp-4],eax
答案 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个字节。如果我在我的盒子上运行你的代码,我只会获得指针的一半。