变量的地址可以在执行期间改变吗?

时间:2012-05-22 05:26:37

标签: java c++ c variables clr

我正在阅读变量的地址绑定,并想知道在任何情况下执行期间变量的地址是否发生变化?是否可能由于JVM或CLR中的垃圾收集而发生?那么C和C ++呢?

7 个答案:

答案 0 :(得分:3)

如果你的代码有未定义的行为,那么所有的赌注都是关闭的,是的,它可能会发生 但是在有效的C / C ++程序中,变量的地址不会改变。

答案 1 :(得分:3)

这在很大程度上取决于语言以及更改地址的含义。在C ++中,对象的地址是唯一标识它的地址,并且它们不能被移动。一些托管语言(包括Java和C#)使用分代垃圾收集器实际上在内存中移动对象(在一代GC中,对象将随着时间从一代移动到另一代),但事实是你不应该关心:那些你可以获得对象地址的语言,地址是固定的,在地址被修复的那些语言中,它不是对象的可感知的状态的一部分......

另请注意,我使用的是 object ,而不是变量,因为我相信这是您感兴趣的内容。有一个分隔对象和变量的细线,例如,在Java中,引用是一个可用于访问对象的变量。但我甚至不会尝试进入......的精确定义。

答案 2 :(得分:1)

在有效的C / C ++程序中,除非您的代码故意或以其他方式更改变量的地址,否则执行环境不会更改地址。

答案 3 :(得分:0)

它不太可能改变,但不会将你的代码建立在假设它不会的基础上。

答案 4 :(得分:0)

在Java中,某些变量的地址可以改变(例如静态或实例字段),而其他变量通常不能(例如局部变量)。对于当前生成的JVM,线程堆栈存在于堆外部的内存段中,并且GC不会移动它们。

然而,就“获取变量的地址”而言,这是没有意义的,因为你不能用Java做到这一点。 (如果可以,那么GC负责处理搬迁。)

答案 5 :(得分:0)

基本上,变量继续在程序的执行时间中引用相同的值或内存位置。但是这可以改变,使其成为uninitialized(具有未定义的值),因此尚未明确给出特定值。这可能会产生不可预测的结果。为了处理这样的问题,内存中变量所需的空间可以仅在首次使用变量时分配,并在不再需要时释放。

答案 6 :(得分:0)

在c ++中,地址不会改变。

请注意,在c ++中,您可以覆盖&运算符虽然对于类tyoe的变量,所以即使地址不会改变,你可能从&变量获得的值可能会改变(这不是地址改变但可能会令人困惑)