一、内存
1.1 内存组织方式
开发人员将程序编写完成之后,程序要先装载到计算机的内核或者半导体内存中,再运行程序。程序被组织成4个逻辑段:
- 可执行代码
- 静态数据
可执行代码和静态数据存储在固定的内存位置- 动态数据(堆)
程序请求动态分配的内存来自内存池,也就是上面所列举的堆。- 栈
局部数据对象、函数的参数以及调用函数和被调用函数的联系放在称为栈的内存池中
二、堆与栈
通过内存组织方式可以得知,堆用来存放动态分配存储空间,而栈用来存放局部数据对象、函数的参数以及调用函数和被调用函数的联系。
2.1 堆
在内存的全局存储空间当中,用于程序动态分配和释放的内存块称为自由存储空间,通常也称之为堆。
在c语言中,是用malloc
函数和free
函数来从堆中动态分配和释放存储。
2.2 栈
程序不会处理堆那样在栈中显示地分配内存。当程序调用函数和声明局部变量时,系统将自动分配内存。
栈是一个后进先出的压入弹出式的数据结构。
三、动态管理
3.1 malloc函数(stdlib.h)
在内存中动态地分配一块size字节的内存空间。
malloc函数会返回一个指针,该指针指向分配的内存空间,如果出现错误则返回NILL
void *malloc(unsigned int size)
3.2 calloc函数(stdlib.h)
在内存中动态分配n个长度为size字节的连续内存空间数组。
calloc函数会返回一个指针,该指针指向动态分配的连续内存空间地址。当分配空间错误时,返回NULL。
void *calloc(unsigned n, unsigned size)
3.3 realloc函数(stdlib.h)
改变ptr指针指向的空间大小为size字节。设定的size字节可以是任意的,也就是说既可以比原来的数值大,也可以比原来的数值小。
返回值是一个指向新地址的指针,如果出现错误则返回NULL。
void *realloc(void *ptr, size_t size);
3.4 free函数(stdlib.h)
使用指针ptr指向的内存区,使部分内存区能被其他变量使用。ptr是最近一次调用calloc或malloc函数时返回的值。
void free(void *ptr)