2.malloc
3.fee
4.calloc
5.realloc
1.为什么要有动态内存分配
•
空间开辟⼤⼩是固定的。
•
数组在申明的时候,必须指定数组的⻓度,数组空间⼀旦确定了⼤⼩不能调整
但是对于空间的需求。有时候我们需要的空间⼤⼩在程序运⾏的时候才能知 道,那数组编译时开辟空间的⽅式就不能满⾜了。
C语⾔引⼊了动态内存开辟,让程序员⾃⼰可以申请和释放空间。
2.malloc
void
*
malloc
(
size_t
size);
这个函数向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针。
•
如果开辟成功,则返回⼀个指向开辟好空间的指针。
•
如果开辟失败,则返回⼀个
NULL
指针,因此malloc的返回值⼀定要做检查。
•
返回值的类型是
void*
,所以malloc函数并不知道开辟空间的类型,具体在使⽤的时候使⽤者自⼰来决定。
•
如果参数
size 为0,malloc的⾏为是标准是未定义的,取决于编译器。
使用malloc包含头文件<stdlib.h>
3.fee
C语⾔提供了另外⼀个函数free,专⻔是⽤来做动态内存的释放和回收的
1
void
free
(
void
* ptr);
free函数⽤来释放动态开辟的内存。
•
如果参数
ptr
指向的空间不是动态开辟的,那free函数的⾏为是未定义的。
•
如果参数
ptr
是NULL指针,则函数什么事都不做。
malloc和free都声明在
stdlib.h
头⽂件中。
4.calloc
calloc
函数也⽤来动态内存分配。
1
void
*
calloc
(
size_t
num,
size_t
size);
•
函数的功能是为
num
个⼤⼩为
size
的元素开辟⼀块空间,并且把空间的每个字节初始化为0。
•
与函数
malloc
的区别只在于
calloc
会在返回地址之前把申请的空间的每个字节初始化为全
0。
5.realloc
•
有时会我们发现过去申请的空间太⼩了,有时候我们⼜会觉得申请的空间过⼤了,那为了合理的使用内存,我们⼀定会对内存的⼤⼩做灵活的调整。那 realloc
函数就可以做到对动态开辟内存⼤⼩的调整。
1.
void
*
realloc
(
void
* ptr,
size_t
size);
•
ptr
是要调整的内存地址
•
size
调整之后新大⼩
•
返回值为调整之后的内存起始位置。
•
这个函数调整原内存空间⼤⼩的基础上,还会将原来内存中的数据移动到新的空间。
•
realloc在调整内存空间的是存在两种情况:
◦
情况1:原有空间之后有⾜够⼤的空间
◦
情况2:原有空间之后没有⾜够⼤的空间
情况1
当是情况1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发⽣变化。
情况2
当是情况2 的时候,原有空间之后没有⾜够多的空间时,扩展的⽅法是:在堆空间上另找⼀个合适⼤⼩的连续空间来使⽤。这样函数返回的是⼀个新的内存地址