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

Ngu*_*iệt 1 c java memory

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

在java中,每个迭代器,我创建一个新对象,然后打印它.结果说每个迭代器我有一个新的Object.

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

在此输入图像描述

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

#include <stdio.h>

int main() {
    while (1) {
        int variable;
        printf("%p\n", &variable);
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

任何人都可以告诉我Java和C的内幕是什么?为什么C不为它的变量创建随机地址?

编辑1:

我有另一个关于C中动态内存管理的问题,如下所示:

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

在此输入图像描述

在这种情况下,它们在每个迭代器之后打印不同的地址.并且每个地址都比以前的常量大小多.

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

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

在此输入图像描述

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

ala*_*ain 6

在Java中,new Ideone()对象生存期未绑定到范围,您可以从函数返回它.

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

C的许多实现使用堆栈来分配这样的对象.使用这种方式时,堆栈总是会给你相同的地址.

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