以下代码未定义的行为、实现是否由标准定义或定义?我找不到任何关于将整数分配给它自己的地址的参考。
volatile int x = (int)&x;
这段代码被翻译成:
lea eax,[ebp-4]
mov dword ptr [ebp-4],eax
在 C 中,x
在声明和初始化中都可以使用:
(C99,6.2.1p7)“[...] 任何其他标识符的范围都在其声明符完成后开始。”
指针到整数的转换结果是实现定义的,可以是未定义的行为:
(C99,6.3.2.3p7)“任何指针类型都可以转换为整数类型。除非前面指定,结果是实现定义的。如果结果不能以整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。”
在 C++ 中,根据声明规则的点。它的定义很好。因为 before =
,变量x
被声明然后&x
是已知的。这是一个棘手的问题,下面的代码是未定义的行为:
int x = x; // undefined behavior, using uninitialized variable
但...
int x = (int)&x; // defined behavior
我说的是 C++,但我相信它也适用于 C。
在您显示的 ASM 代码中,首先将指针的值放入eax
,然后读取指针eax
并将其放入与整数值相同的位置。
这里唯一的问题是 aint
并不总是与 a 的大小相同int*
。在我的 64 位机器上,int
s 是 4 个字节,指针是 8 个字节。如果我在我的盒子上运行你的代码,我只会得到一半的指针。