变量的地址在执行过程中可以更改吗?
Can the address of variable change during execution?
我正在读取变量的地址绑定,并想知道变量的地址在任何情况下在执行过程中是否更改?会不会由于 JVM 或 CLR 中的垃圾回收而发生?那么C和C++呢?
这在很大程度上取决于语言以及更改地址的含义。在C++中,对象的地址是唯一标识它的内容,并且不能移动它们。一些托管语言(包括 Java 和 C#(使用代垃圾收集器,这些垃圾收集器实际上在内存中移动对象(在代 GC 中,对象会随着时间的推移从一代移动到另一代(,但事实是你不应该关心: 在那些可以获得对象地址的语言中,地址是固定的, 在地址固定的那些中,它不是对象可感知状态的一部分......
另请注意,我在这里使用的是对象,而不是变量,因为我相信这是您感兴趣的。有一条细线将对象和变量分开,例如,在Java中,引用是可用于访问对象的变量。但我什至不会尝试进入任何一个的确切定义......
如果你的代码有未定义的行为,那么所有的赌注都关闭了,是的,它可能会发生。
但是在有效的 C/C++ 程序中,变量的地址不会改变。
在有效的 C/C++ 程序中,除非您的代码有意或其他方式更改变量的地址,否则执行环境不会更改该地址。
它不太可能改变,但不要基于它不会改变的假设来编写代码。
在Java中,某些变量的地址可以更改(例如静态或实例字段(,而其他变量通常不能更改(例如局部变量(。 对于当前一代 JVM,线程堆栈位于堆外部的内存段中,GC 不会移动它们。
但是,对于"获取变量的地址"而言,这是没有意义的,因为您无法在Java中执行此操作。 (如果可以的话,那么GC有责任处理搬迁问题。
基本上,变量继续引用程序执行时间内的相同值或内存位置。但是这可以改变,使其uninitialized
(具有未定义的值(,因此尚未明确给定特定值。这可能会产生不可预测的结果。为了处理此类问题,内存中变量所需的空间只能在首次使用变量时分配,并在不再需要时释放
在 c++ 中,地址不会改变。
请注意,在 c++ 中,你可以覆盖 & 运算符,但对于类 tyoe 的变量,所以即使地址不会改变,你可能从 &variable 得到的值也可能会改变(这不是地址改变,但可能会令人困惑(
- 是否删除在对象构造过程中创建的对象
- 如何在鼠标挂钩过程中检测拖动
- clang 插件:在编译过程中修改 AST
- Adafruit 羽毛RFM69HCW在使用过程中会冻结,需要硬重置
- 线程过程中的线程同步问题
- MySQL 连接器/C++.尝试在此过程中停止连接到数据库
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?
- 在调用过程中删除 std::函数
- 动态矩阵特征分解过程中的误差
- cmake在构建过程中使用另一个工具检测标志
- 在模板参数推导过程中丢失限定符
- 升压过程中的管道缓冲区大小
- 如何在插入过程中更改插入的值
- 在PostgreSQL函数或过程中使用C++代码
- Vulkan:设备在缓冲区复制过程中丢失
- 如何解决导入dll过程中Viual Studio中的并排配置错误
- C++:如何在对象构造过程中调用初始值设定项列表之外的成员构造函数
- Node中的子节点列表在C++中的BFS遍历过程中丢失
- 如何在解析过程中区分 IP 地址和域名
- 变量的地址在执行过程中可以更改吗?