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

Assigning an int's own address to its value

本文关键字:分配 地址 int 自己的      更新时间:2023-10-16

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

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++中,根据声明点规则。它定义得很好。因为在=之前,变量x被声明,然后&x是已知的。这是一个棘手的点,下面的代码是未定义的行为

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

但。。。

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

我说的是C++,但我相信它对 C 也有效。

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

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