c/c++和java的内存分配到底是怎么回事
今天遇到了这个问题,想搞的彻底些,查了些资料,还不太完善,望指教。
在c++中
栈中存放的是局部变量,函数的形参等东西,是程序自动为我们分配的,类似数据结构中的栈,先进后出
堆中存放的是new出来的东西,内存的申请与释放需要程序员手动完成,类似于数据结构中的链表
struct Student
{
int num;
char name[10];
};
Student *stu = new Student;
那么stu被分配在了栈中,而堆中则分配了4+10个字节吧,stu指向这个内存的首地址。
Student stu;在这句话中stu被分配在了栈中,那么他占据多少内存呢,是4+10个?还是语法错误,因为没有初始化?
自由存储区存放malloc分配的内存,是c语言中的用法,类似于堆。
静态区存放static申明的变量,不论是局部的或是全局的,不能用extern关键字来申明为其他区域。
常量区存放const申明的常量,给数据不可以改变。
在java中
同样是这些东西
Student stu=new Student;
stu存放在栈中,new出来的东西存放在堆中,stu这个引用指向了student。这些东西不必程序员去手动释放。
其他东西的存放类似于c++;
那么Student stu;
是否也是错误呢?
[解决办法]
JAVA里不清楚。
在C++里 new出来的对象或变量都是保存在堆区的。程序员自己申请自己释放。
而Student stu;这样的是保存在栈区。系统自动申请内存自动释放。
还有你的另外一个
int* pData=new int;
这句代码会消耗8个字节内存,或许你会说int不是4个字节吗。是 但是pData自身也是一个变量,指针变量。
所以new出来的内存是堆区内存 而 pData应该是在栈区的。
[解决办法]
Student stu;在这句话中stu被分配在了栈中,那么他占据多少内存呢,是4+10个.
应该是,也许是4+12,因为有内存对齐的问题。
[解决办法]
楼主,你在研究这些问题的时候,你要明白 什么是堆栈,什么是堆?
java的垃圾回收机制是 ?
[解决办法]
咱们的内存条我知道的是分为静态存储区(程序段)、动态存储区(数据区) 、栈区、堆区。具体的话自己多写写代码,进行地址的查找,然后进行栈的查看。我也在学习,希望可以有所帮助
[解决办法]
#if 1
#include<stdio.h>
struct Student
{
int num;
char name[10];
};
void main()
{
struct Student stu;
int i = sizeof(stu);
}
#endif
这个我试了一下,I= 16 考虑到了内存对齐的问题,与你的问题无关哈,补充一下
[解决办法]
#pragma pack(1) // 想要14填写这句
struct Student // struct有内存对齐
{
int num;
char name[10];
};
void main()
{
struct Student stu;
printf("%d",sizeof(stu));
/**
java 中的
Student stu;
这样实际上只是一个声明,没有实际的分配
java一定要初始化,要么从别的引用获得,要么自己new。
可以把声明看做一个指针 int *p;
而 C/C++
这样样已经在栈里头分配内存
*/
}