前言:
c语言中的数据结构通常是固定的。例如一旦程序完成了编译,数组元素的数量就固定了。因为在编写程序的时候强制选择的大小,所以固定大小的数据结构可能出现问题。那么我们就需要动态存储分配,即在程序执行期间分配内存单元的能力。利用动态存储分配,可以动态存储分配,可以设计出能根据需要扩大的数据结构。
一:内存分配函数
1》:malloc
malloc函数——分配内存块。但是不对内存块进行初始化。
malloc
void* malloc (size_t size);
可以看出它的返回类型是void*,是因为malloc只知道申请多大的空间,但是不知道回放了什么类型的数据
malloc申请的空间是内存的堆区。可以参考下面的图片
2》:calloc
calloc函数————分配内存块,并且对内存块进行清零。
calloc
void* calloc (size_t num, size_t size);
calloc函数为num个元素的数组分配空间,其中每个元素的长度是size个字节
3》:realloc
realloc函数--------------调整先前分配的内存块大小
realloc
void* realloc (void* ptr, size_t size);
当数组分配完内存后,可能会发现数组过大或者过小。realloc函数就可以调整数组的大小使它更加合适需求。
注意:当调用realloc函数时,ptr必须指向先前通过malloc、calloc或者realloc的调用获得的内存块。其中的size表示内存块的新尺寸,新尺寸没有要求,按实际情况来规定尺寸。
其如果调整空间失败,会返回NULL.
如果调试空间成功,则有两种情况
1:在已经开辟好的空间后面,没有足够的空间,直接进行空间的扩大
在这种情况下,realloc函数会在内存的堆区重新找一个空间(满足新的空间的大小需求)
同时会把旧的数据拷贝新的空间,然后释放旧的空间,同时返回新的空间的起始地址
2:已经开辟好的空间后面,有足够的空间,直接进行扩大,扩大空间后,直接返回旧的空间的起始地址。
补充:free函数 使用free函数很简单,只需要简单地把指向不需要的指针传递给free函数就可以释放相应的地址了。free函数的实参必须时先前由内存分配函数返回的指针。