C / Java中的堆栈与堆

Stack vs Heap in C/Java

这是我的理解。

在C语言编程中,如果我执行int a,那么a是在堆栈上创建的,因此内存是从堆栈中获取的。堆在这里不起作用。

但是如果我做一些像

1
2
int *a;
a=(int*)malloc(sizeof(int));

动态分配内存,然后将引用变量放在堆栈上,但它指向的内存将放在堆栈上。

我的理解正确吗?

现在,我用JAVA写了这本书

Whenever you need an object, you
simply write the code to create it by using new, and the storage is allocated on the
heap when that code is executed.

那么在Java中没有堆栈对象的创建方法吗?

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


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


没错。对象存储在堆中。堆栈包含原始值,如intdouble(来自局部变量)和对对象的引用(同样来自局部变量)。


您的问题的整个前提是错误的:在Java中,您无法控制对象将被分配到何处。有些确实是堆栈分配的,但您永远不会注意到区别。

Java和C之间根本不同的是,在Java中,变量的值永远不能是对象本身,而在C中,值可以是EDCOX1×2本身,而不是间接的。您可以将这些结构按值传递给其他函数,在Java中没有等价的函数。