将 int 自己的地址分配给其值
Assigning an int's own address to its value
以下代码是未定义的行为,实现是由标准定义的还是定义的?我找不到任何关于将整数分配给其自己的地址的参考。
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 个字节。如果我在我的盒子上运行你的代码,我只会得到一半的指针。
相关文章:
- 将数组的地址分配给变量并删除
- 将地址分配给本地指针后,公共对象的变量将消失
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- LLVM 传递以在特定地址分配内存
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 给定特定内存地址的数组的动态内存分配
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 获取指针的地址会为其分配一个值
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- 如何按顺序或在指定的地址分配内存?
- 我可以直接为指针分配地址吗?如果是,如何做到这一点
- 是否可以在运行时为宏分配地址
- 为迭代器分配地址
- 如何查找继承类的分配地址
- 如何在 c++ 中为 boost::shared_ptr 分配地址
- 为指针分配地址
- 使用 'memcpy()' 为指针分配地址