动态内存分配
当一个数组被声明时,他所需要的内存在编译时就被分配。
但我们总是会写类似的代码:
int a[1000000] = { 0 };
从某种意义上来说,没错,并且这类方式可以很好的避免数组溢出的问题。
但同时,这绝对不是个好程序,原因很简单,内存帮你分配了sizeof(int)*1000000;
但很多内存你可能根本用不到,这就造成了浪费。万幸的时,在C和C++中程序员可以手动分配内存以及释放掉不用的内存。
一、malloc 与 free
两者均在头文件stdlib.h中声明。
malloc从内存池中提取一块合适内存,并向该程序返回一个指向这块内存的指针。
当一块以前分配的内存不再使用时,程序调用free函数把它归还给内存池供以后之需。
ps:malloc分配的是一块连续的内存,如果内存池的可用内存可以满足这个需求,malloc就返回一个指向被分配内存块起始位置的指针。如果内存池是空的,它就会请求系统获得更多内存,如果系统都无法提供更多内存,那么将会返回一个NULL指针
因此!!对每个从malloc返回的指针都要进行检查,确保它并非NULL,这非常重要。
ps:C++中的new可能会更加方便,但本次学习日记介绍的主要是C,故在此不再过多复述
void *malloc(size_t size);
void free(void *pointer);
malloc返回一个void指针,正是由于这个原因。标准表示一个void类型的指针可以转换为任何其他类型的指针。
二、calloc与realloc
calloc也用于分配内存,与malloc最大区别是,calloc在返回指向内存的指针前把它初始化为0.relloc函数用于修改一个原先已经分配的内存块大小,可以使一块内存扩大或减小
void *calloc(size_t num_elements,size_t element_size);
void relloc(void *ptr,size_t new_size)
传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。
!!注意,不要访问已经被free函数释放的内存。最常出现的情况是,已经对一个指向动态分配内存的指针进行了复制,然后在程序其他部分访问该副本。