27

以下代码未定义的行为、实现是否由标准定义或定义?我找不到任何关于将整数分配给它自己的地址的参考。

volatile int x = (int)&x;

这段代码被翻译成:

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

3 回答 3

21

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

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

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

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

于 2013-11-11T19:44:51.363 回答
11

在 C++ 中,根据声明规则的点。它的定义很好。因为 before =,变量x被声明然后&x是已知的。这是一个棘手的问题,下面的代码是未定义的行为

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

但...

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

我说的是 C++,但我相信它也适用于 C。

于 2013-11-11T19:48:10.203 回答
2

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

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

于 2013-11-11T19:48:57.603 回答