根据内存空间的分配方式不同,可分为:静态内存和动态内存。
一、静态内存
所谓静态内存就是指程序在开始运行时有编译器分配的内存,它的分配在程序开始编译时完成的不需要占用CPU资源。
二、动态内存
动态内存主要是程序员自行控制内存的分配和释放,其过程往往发生在程序运行过程中。正确的使用动态内存可以提高效率,但是一旦用不好就有可能导致整个项目的坍塌。
三、两者的区别
1、静态内存的分配是程序在开始编译时完成的,不占用CPU资源;动态内存的分配实在程序运行过程中完成的,动态内存的分配和释放都占用CPU资源。
2、静态内存在栈上分配;动态内存在堆上分配。
3、动态内存分配需要指针和引用数据类型的支持;静态内存不需要。
4、静态内存分配是在编译前就已经确定了内存块的大小,属于按计划分配内存;而动态内存的分配是在程序运行中,根据需要随时分配的,属于按需分配。
5、静态内存的控制权是交给编译器的;而动态内存的控制权是有程序员决定的。
四、动态内存分配
常用的动态内存分配函数有:malloc()、calloc()
malloc()函数:
原 型: void *malloc(unsigned int num_bytes);
头文件: #include <stdlib.h>或#include <malloc.h>
功 能:分配长度为num_bytes字节的内存块
返回值: 如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。
说 明:关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
calloc()函数:
原 型:void *calloc(unsigned int n, unsigned int size);
头文件: #include <stdlib.h>或#include <malloc.h>
功 能:在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。
返回值: 如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
malloc()和calloc()函数的区别:
calloc()在动态分配完内存后自动初始化内存空间为零,而malloc()不初始化;
calloc()在内存的动态存储中分配n个长度为size的内存块,而malloc()仅分配1个。
realloc()函数,该函数的功能是调整指定的内存区域的大小;
函数原型:
void *realloc(void *mem_address,unsigned int newsize);
当参数mem_address为NULL时,其功能如同malloc();当参数newsize为0时,其功能就相当于free()。
五、动态内存的释放
通过malloc()、calloc()、realloc()函数分配动态内存,在使用完动态内存后需要使用free()函数释放申请的动态内存,以免造成内存泄漏等问题,内存释放后,原指向内存空间的指针就变成了空指针不能再使用。
free()函数的原型:
void free(void *memblock);
参数memblock表示要被释放的内存块。