一、Linux分配给进程中的地址空间:
- 代码段
存储程序文本,又称文本段,指令指针从这里获得指令,可以被共享。
- 数据段
用来存储数据。分为初始化为非0的数据区,BBS(Block Started by Symbol 用来存放未初始化的全局数据和静态数据) 和堆(Heap 用来动态分配内存,就是说malloc等函数可以在这里或的分配内存,地址是向上增长的)
- 堆栈段
(Stack),堆栈里存放局部变量、各个函数的参数、返回地址以及临时变量,地址是向下增长。
高地址 | |
堆栈段 | 程序栈(向下增长) |
数据段 | BBS 非零数据
|
低地址 | 代码 |
代码段 |
动态内存空间:
在堆中分配,实现动态分配的函数有:
stdlib.h:
void *malloc(size_t size); 分配一个size大小的内存空间,返回一个void类型的指向该空间的指针。
void calloc(size_t nmemb,size_t size);calloc分配的空间大小=nmemb * size,其余与malloc相同。
void realloc(void *ptr,size_t size);用来重新分配size大小的空间,改变已经分配的空间大小,返回一个指向新空间的指针。
void free(void *ptr);用来释放以上3个函数分配的空间。
二、内存分配
内存分配方式:
- 从静态存储区域里
内存在程序编译的时候就已经分配好了,在程序的运行期间,这块内存都是存在的。
Eg:全局变量,static变量
- 在栈上
在执行函数的时候,函数里的局部变量的存储单元可以在栈上创建,函数执行结束的时候,这些存储单元就会自动被释 放。对于栈内存分配运算来说,它们是已经在处理器指令集中的,效率高,但是分配内存容量还是有限的。
- 从堆上
在堆上分配内存幼教动态内存分配。Eg:malloc和free,new和delete,动态内存的生存期是由我们决定的。
在使用动态内存的时候有注意5点:
- 用malloc或new申请内存后,需要检查指针值是否为null,不要访问空指针的内存(这是块禁区,~~~~(>_<)~~~~ )
- 记得给数组和动态内存赋初值
- 表让数组或者指针越界
- 申请内存与释放内存要一一对应
- free或delete后,需要将指针设为空指针null。