1. 物理存储组成
物理存储器容量由小到大依次为寄存器、缓存、主存、本地磁盘、远程存储服务器,其存取速度由快变慢,单位字节的价格由高变低。
2. 分段
操作系统提供了一个物理内存的抽象,这个抽象就叫地址空间,是运行程序所能看到的系统中的内存。进程的地址空间包含了运行程序的所有内存状态。比如:程序的代码、栈保存当前函数的调用信息,分配空间给局部变量,传递参数和函数返回值。最后,堆用于管理动态分配的、用户管理的内存(malloc或new申请的)。还有静态初始化的变量。操作系统在专门硬件的帮助下,通过每一个虚拟内存的索引,将其转换为物理地址,从而进行访问。
2.1 内存类型及API
2.1.1 栈内存
在运行一个C程序时,会分配两种内存。第一种称为栈内存,它的申请和释放操作是编译器来隐式管理的,所以有时也称为自动内存。当函数退出时,编译器会释放该内存。函数不能返回指向栈内存的指针。
2.1.2 堆内存
这种主要针对长期内存要求,所有申请和释放操作都由程序员完成。
void *malloc(int num); //返回指向新内存的指针
在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。
void free(void *address);
该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。
2.1.3 TXT区域(代码段)
储存是存放二进制可执行代码的位置
2.1.4 Data区域
存放静态常量,从高地址开始向下增长
2.1.5 BSS区域
存放未初始化的静态变量
2.2 内存常见错误
忘记分配内存
char *src="hello";
char *dst;
strcpy(dst,src);//segfault
运行这段代码,可能会导致段错误。
没有分配足够的内存
char *src="hello";
char *dst=(char*)malloc(strlen(src));//too small