java - Java和C如何管理局部变量的内存?

标签 java c memory

我正在考虑 Java 和 C 如何管理范围内的变量。

在 java 中,每个迭代器,我创建一个新对象,然后打印它。结果表明每个迭代器都有一个新对象。

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        while (true) {
            Ideone object = new Ideone();
            System.out.println(object);
        }
    }
}

enter image description here

还有 C 中的范围变量。我做的和在 Java 中做的一样。每个迭代器我创建一个变量并打印它的地址。但结果让我感到困惑,因为它返回的是相同的地址,因为我认为每个迭代器都会在随机地址

创建一个新变量
#include <stdio.h>

int main() {
    while (1) {
        int variable;
        printf("%p\n", &variable);
    }
}

enter image description here

谁能告诉我 Java 和 C 的底层是什么??为什么 C 不为其变量创建随机地址?

编辑 1:

我还有一个关于 C 语言动态内存管理的问题:

#include <stdio.h>
int main() {
    while (1) {
        int *variable = malloc(sizeof(int));
        printf("%p\n", variable);
    }
}

enter image description here

在这种情况下,它们在每个迭代器之后打印不同的地址。每个地址都比前一个地址大。

但是如果像这样释放内存,现在它会打印相同的地址

#include <stdio.h>
int main() {
    while (1) {
        int *variable = malloc(sizeof(int));
        printf("%p\n", variable);
        realloc(variable, 0);
    }
}

enter image description here

C 内存管理不会为新变量生成随机地址吗?

最佳答案

在 Java 中,new Ideone() 对象的生命周期不受范围限制,您可以从函数中返回它。

在您的 C 代码中,int variable; 创建一个对象,当您到达定义它的范围的末尾时,该对象会自动销毁。

C 的许多实现使用堆栈来分配此类对象。以这种方式使用时,堆栈将始终为您提供相同的地址。

这种比较有点像苹果与橙子的比较。将 Java 的 new 与 C 的 malloc 进行比较会显示出类似的行为。

关于java - Java和C如何管理局部变量的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43938915/

相关文章:

java.lang.UnsupportedClassVersionError : Bad version number in . 类文件

java - Play 解析 application.conf 时无法读取 Heroku 配置变量

无法打印在循环中递增的变量值

java - java对象的动态过滤

java - Hibernate BeanCreationException 异常

c - K&R C 练习帮助

c++ - 为 Visual Studio 2010 设置 OpenCV-2.3

java - 动态声明 TextView

c - 估计erlang数据结构的内存范围

java - 32 位 JDK 上的最大内存分配