【问题标题】:Assigning an int's own address to its value将 int 自己的地址分配给它的值
【发布时间】:2013-11-23 17:37:46
【问题描述】:

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

volatile int x = (int)&x;

这段代码被翻译成:

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

【问题讨论】:

  • 我认为这归结为如何处理将地址转换为整数。我认为它存储在整数本身中的事实无关紧要。
  • x 的值将由实现定义,只要int 至少与int * 一样宽;就像您使用 reinterpret_cast 从指针转到 int 一样。
  • 我会说它是实现定义的。在某些平台上,int 可能无法保存指针(地址)的值。例如,具有 24 位寻址的 16 位字系统。
  • 著名的 C/C++ 标准?
  • @DieterLücking 这不是重复的。我在询问编译器在将其自己的地址分配给本地整数时的行为,而您所指的问题涉及将地址作为参数提供给函数

标签: c++ c


【解决方案1】:

在 C 中,在声明和初始化中都使用x 很好:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    但是……

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-10
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-03
        相关资源
        最近更新 更多