stack,栈,准确来说,应该叫“堆栈”。
heap,堆。
程序运行时占用的内存分为如下5个区:
stack,栈,这玩意儿是系统分配的,大小有限,一般windows上默认给程序分配的是1M,所以你会看到stack overflow这种报错。这货一般保存局部变量和函数参数。
heap,堆,这玩意儿是你自己申请和释放的,你不释放那就只能等程序跑完,系统帮你回收了,搞不好就泄漏了。你用什么new、delete、malloc、free啊什么的,操作的那片内存,就是heap。
static,静态区,一般是来放全局变量和static变量(包括static全局变量和static局部变量)。 初始化后的放在一块,没有初始化的放在旁边一块。
文字常量区,常量字符串就存在这里,程序完了后系统自动释放。
代码区,函数的二进制代码。
不过,看到也有资料说,程序运行时占用的内存分为如下五个区:
代码区、初始化数据区、未初始化数据区、堆区、栈区。
我个人感觉上面两种说法应该说的都差不多。因为我们的stack和heap,栈和堆用好了,程序就问题不大了。
在别处看到一个例子,关于程序内存分配的,感觉很有道理。摘录下来,大家看一下:
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b; //栈
char s[] = "abc";// 栈
char *p2; //栈
char *p3 = "123456"; //123456在常量区,p3在栈上。
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
不过这货好像malloc后没有free啊,哈哈哈