C/Java中的堆栈与堆

C/Java中的堆栈与堆,java,c,stack,heap,Java,C,Stack,Heap,这是我的理解 在C编程中,如果我执行inta,那么a将在堆栈上创建,从而从堆栈中获取内存。堆在这里不起作用 但如果我做了类似的事情 int *a; a=(int*)malloc(sizeof(int)); 并动态分配内存,则引用变量将被放置在堆栈上,但它指向的内存将位于堆上 我的理解正确吗 现在,我拿起这本关于java的书 无论何时你需要一件物品,你都可以 只需编写代码,使用new创建它,就可以在 当代码被执行时堆 所以在Java中无法在堆栈上创建对象 我想,基本数据类型仍然可以放在堆栈上,但

这是我的理解

在C编程中,如果我执行
inta
,那么
a
将在堆栈上创建,从而从堆栈中获取内存。堆在这里不起作用

但如果我做了类似的事情

int *a;
a=(int*)malloc(sizeof(int));
并动态分配内存,则引用变量将被放置在堆栈上,但它指向的内存将位于堆上

我的理解正确吗

现在,我拿起这本关于java的书

无论何时你需要一件物品,你都可以 只需编写代码,使用new创建它,就可以在 当代码被执行时堆

所以在Java中无法在堆栈上创建对象


我想,基本数据类型仍然可以放在堆栈上,但我关心的是对象。

在Java中无法在堆栈上创建对象。Java还具有自动垃圾收集功能,因此您没有任何删除对象的方法。您只是让对它们的所有引用超出范围,最终垃圾回收器会处理它们。

这是正确的。对象存储在堆上。堆栈包含原始值,如
int
double
(来自局部变量)和对对象的引用(同样来自局部变量)。

问题的全部前提是错误的:在Java中,您无法控制对象的分配位置。有些确实是堆栈分配的,但您永远不会注意到区别


Java和C的根本区别在于,在Java中,变量的值永远不能是对象本身,而在C中,值可以是结构本身,没有间接性。您可以通过值将此类结构传递给其他函数,而Java中没有类似的功能。

现代JVM能够跳过某些短期对象的堆使用,并在执行实时编译步骤时将它们扔到堆栈上。然而,您无法控制这一点。对您所说的一个更正是:在C中,在您提到的第一种情况(int a)中,a仅当它是函数的局部变量时(并且未声明为静态变量)才会存储在堆栈上。如果声明为全局或静态,则存储在数据段中,细分为只读数据(如字符串常量)和未初始化数据(BSS)。对于分配内存区域的引用,在第二种情况下也会发生同样的情况。