int a = 10; //全局变量,全局区。 全局变量初始化且初始化不为0,存放在内存的.data段
int m; // 全局变量初始化为0或者未初始化,存放在.bss段
class SomeClass
{
private:
int b; //由使用决定,在main函数中类SomeClass动态分配,因此在堆区。
static int c; //静态成员在全局区。
};
int main()
{
int d = 0; //栈区。
SomeClass *p = new SomeClass; //栈区。
return 0;
}
内存空间分布图
内存分区 | 说明 |
---|---|
程序代码区(code area) | 存放函数体(类成员函数和全局函数)的二进制代码 |
静态数据区(data area) |
注意: 未初始化的全局变量的默认值是 0,而未初始化的局部变量的值却是垃圾值(任意值)。 静态数据区的内存在程序结束后由操作系统释放。 |
堆区(heap area) |
一般由程序员分配和释放,若程序员不释放,程序运行结束时由操作系统回收。malloc()、calloc()、free() 等函数操作的就是这块内存 |
栈区(stack area) | 由系统自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。 |
命令行参数区 | 存放命令行参数和环境变量的值,如通过main()函数传递的值。 |
提示:关于局部的字符串常量是存放在全局的常量区还是栈区,不同的编译器有不同的实现,VC 将局部常量像局部变量一样对待,存储于栈(⑥区)中,TC则存储在静态数据区的常量区(②区)
内存模型示意图
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a = 0; // 全局初始化区(④区)
char *p1; // 全局未初始化区(③区)
int main()
{
int b; // 栈区
char s[] = "abc"; // 栈区
char *p2; // 栈区
char *p3 = "123456"; //
123456\0 在常量区(②),p3在栈上,体会与 char s[]="abc"; 的不同
static int c = 0; // 全局初始化区
p1 = (char *)malloc(10), // 堆区
p2 = (char *)malloc(20); // 堆区
// 123456\0 放在常量区,但编译器可能会将它与p3所指向的"123456"优化成一个地方
strcpy(p1, "123456");
}
栈和堆的区别:
- 栈内存是由系统分配,系统释放的;以函数为单位进行栈内存分配,函数栈帧,局 部变量,形参变量等都存放在栈内存上。堆内存是由用户自己分配的,C 语言用 malloc/free 进行分配释放,C++用 new/delete 进行分配释放,由于堆需要用户自己管理,因此堆内存 很容易造成内存泄露,而栈内存不会。
- 栈的内存分配释放速度快效率高,内存都是连续的;堆内存的分配释放相对于栈来 说效率低一些,内存不一定连续,容易产生内存碎片,但是灵活性高。
- 栈是由高地址向低地址扩展的连续内存,栈的大小一般为 2M 或者 10M(大家的 redhat 系统可以用 ulimit -s 命令来查看,是 10M);堆是由低地址向高地址扩展的非连续内 存,堆的大小影响的因素比较多,和系统虚拟内存的大小有关系。
看到其他总结的比较好的博客
https://blog.csdn.net/qq_21842557/article/details/50777199
http://blog.csdn.net/FreeeLinux/article/details/53782986