目录
1 什么是动态内存分配
数组元素存储在内存中连续的位置,当数组被声明时,他所需要的内存在编译时就会被分配。动态内存分配指的是在程序运行时为它分配内存。
2 为什么要使用动态内存分配
当你声明一个数组时,你必须要指定数组长度,但是数组长度一般是在运行后才确定的,比如说你存储公司员工信息,但是每个公司的员工数目是不确定的,为了能存储可能出现的最多元素,我们一般采取声明一个尽可能大的数组。这种方式缺点比较明显,一方面当你存储小公司员工信息的情况时,申请的空间大部分没有用到,造成资源的浪费;另一方面当你存储大公司的员工时,也有可能申请空间不够大,不能完全存下员工信息,所以就需要我们来使用动态内存分配的方式在程序运行时申请合适的内存空间。
3 如何使用动态内存
c函数库提供了两个函数,malloc函数和free函数,malloc函数用来申请动态内存,成功的话会返回一个指向申请到内存的指针;free函数是用来释放掉malloc申请到的空间,动态申请的空间是一定要释放的,否则就会造成内存泄漏,内存泄漏将会一点点榨干可用内存,最后无内存可用,只能重启系统来摆脱困境。
3.1 malloc函数
头文件:stdlib.h
原型
void *malloc( size_t size);
功能;用来动态申请内存,申请到的空间不会初始化
参数:
size;申请空间的大小
返回值;
成功;返回一个指向申请成功分配内存的指针
失败;返回NULL指针
3.2 free函数
头文件:stdlib.h
原型
void free( void *pointer);
功能:用来释放动态申请的内存
参数:
pointer:malloc、calloc、realloc函数返回的指向动态内存的指针
返回值:无
3.3 calloc函数
头文件:stdlib.h
原型
void *calloc(size_t num_elements, size_t element_size);
功能:分配并初始化内存
参数:
num_elements:需要初始化的值
element_size:申请内存的大小
返回值:
成功;返回一个指向申请成功分配内存的指针
失败;返回NULL指针
3.4 realloc函数
头文件:stdlib.h
原型
void *realloc(void *ptr, size_t new_size);
功能:修改已经分配好内存的大小,扩大则保留原值并在内存后面新增未初始化的内存块,缩小则内存块尾部空间被拿掉,剩余部分保留,若原内存块无法改变大小,relloc会将原内存块内容复制到新分配的内存上。
参数:
ptr:指向内存的指针
new_size;新内存的大小
返回值:
成功;返回一个指向申请成功分配内存的指针
失败;返回NULL指针
4 常见动态内存错误
动态内存分配最常见的错误就是忘记检查所请求的内存是否分配成功
new_mem = malloc(size);
if(new_men == NULL){
printf("out of memory\n");
exit(1);
}
第二个常见错误就是操作内存超出了分配内存的边界,超出的内存中如果保存了其他变量的值,对它的修改则会破坏变量的值,这种bug很难被察觉。也有可能直接终止程序